이번에는 Model을 만들어야 하는데, Model이라고 하면 business 로직에 해당하는 것으로, 게시판으로 따지면 게시물 추가, 수정, 삭제, 리플, 리스트 가져오기, 페이징 처리 하기 등이 Model에 해당하겠죠. 대부분 oracle sql query를 해서 처리를 하겠죠? 그래서 BoardDAO class를 하나 만들어야 하구요. 그리고 또 필요한건.. 게시판에서 가장 기본이 되는 Board class를 만드는 겁니다. 이곳에는 setter , getter가 존재하여 데이터를 저장하거나 로드하거나 합니다. 게시판에서 게시물에 대해서는 모조리 Board object에 담아서 다니게 되는 것입니다. BoardDAO에서는 Board class를 전적으로 사용합니다. 그러므로, 데이터를 접근하는 방법은 BoardDAO와 Board를 통하는 방법 이외에는 존재하지 않게 됩니다.
1. Board class
/*
* Created on 2004. 10. 27.
* author : suny<skyfafa@gmail.com>
*/
package com.board.model;
public class Board {
// 모두 private 로 접근제한 됩니다.
private int sno = 0;
private int top = 0;
private String vno = null;
private String title = null;
private String id = null;
private String content = null;
private String navi = null;
public Board() { // constructor
}
public int getSno() { // getter
return sno;
}
public int getTop() { // getter
return top;
}
public String getVno() { // getter
return vno;
}
public String getContent() { // getter
return content;
}
public String getId() { // getter
return id;
}
public String getTitle() { // getter
return title;
}
public String getNavi() // getter
{
return navi;
}
public void setSno(int i) { // setter
sno = i;
}
public void setTop(int i) { // setter
top = i;
}
public void setVno(String vno) { // setter
this.vno = vno;
}
public void setContent(String string) { // setter
content = string;
}
public void setId(String string) { // setter
id = string;
}
public void setTitle(String string) { // setter
title = string;
}
public void setNavi(String navi) // setter
{
this.navi = navi;
}
public void reset() // reset
{
sno = 0;
top = 0;
vno = "";
title = "";
id = "";
content = "";
}
}
class 내용자체가 간단하므로, 별다른 설명이 필요없겠죠.. DB에서 query하는 데이터이건, 웹에서 입력한 데이터이건 Board class에 저장되어 Object로 Model , View , Controller 사이에서 서로 주고 받게 됩니다.
2. BoardDAO class
DB 관련 된 내용이 주가 되겠죠. 이번엔 우선 sql만 보도록 하죠. thread형 게시판로직은..
1 1 9999999999 test1
2 2 9999999998 test2 - 1씩 뺀다.
3 2 9999999998.3 [re]test2 - test2의 답글
4 2 9999999998.3.4 [re][re]test2 - [re]test2의 답글
5 5 9999999997 test3
6 6 9999999996 test4
7 1 9999999999.7 [re]test1 - test1의 답글
이런식으로 했습니다.
그러므로 desending sequence를 하나 생성했구요. 인덱스는 VNO 컬럼에 설정하였습니다.
private static String INSERT_QUERY = "INSERT INTO board ( sno , top , vno , id , title , content ) VALUES ( ? , ? , ? , ? , ? , ? )"; // 게시물 생성시 사용하는 query
private static String MAX_SNO_QUERY = "SELECT /*+ INDEX_DESC(board IDX_BOARD_PK) */ nvl(max(sno),0)+1 FROM board WHERE sno > 0"; // sno를 1씩 증가해서 새로운 게시물에 할당하는 query
private static String GET_VNO_QUERY = "SELECT seq_board.nextval FROM dual"; // 게시판 위치 표시 값을 시퀀스에서 하나 가져오는 query
private static String COUNT_QUERY = "SELECT count(*) FROM board WHERE sno > 0"; // 전체 게시물 개수 가져오는 query
private static String LIST_QUERY = "SELECT sno , vno , top , title , id FROM board WHERE vno >= ( SELECT vno FROM ( SELECT rownum rnum , vno FROM board WHERE vno > ' ' AND rownum <= ? ) WHERE rnum = ? ) AND rownum <= 10"; // 페이지 번호에 따른 해당 게시물 가져오는 query. 여기서 SELECT rownum rnum , vno FROM board WHERE vno > ' ' AND rownum <= ? 이부분에서 1페이지 이면 10개의 데이터를 가져오고, 2페이지면 20개를 가져오고, 100페이지면 1000개의 데이터를 가져오게 되어 있어서, 페이지가 늘어나면 늘어날 수록 가져오는 양이 많아 집니다. 그런데, plan상으로는 cost가 동일하더군요.. trace를 떠봐야 더 정확하게 알 수 있겠지만 암튼 query자체는 실제 테이블에 접근조차 하지 않기 때문에 성능상에는 문제가 없을 것으로 보여집니다.
private static String VIEW_QUERY = "SELECT sno , vno , top , title , id , content FROM board WHERE sno = ?"; // 게시물 상세 보기 query
private static String NEXT_PREV_QUERY = "SELECT sno , vno , top , 'NEXT' navi FROM board WHERE vno = ( SELECT /*+ index(board idx_board) */ vno FROM board WHERE vno > ? AND rownum <= 1 ) UNION ALL SELECT sno , vno , top , 'PREV' navi FROM board WHERE vno = ( SELECT /*+ index_desc(board idx_board) */ vno FROM board WHERE vno < ? AND rownum <= 1 )"; // 이전 , 다음 게시물 번호 가져오는 query
private static String DELETE_QUERY = "DELETE FROM board WHERE sno = ?"; // 게시물 삭제 query
쿼리들은 모두 부분범위처리가 적용되어 있고, driving set은 대부분(?) index access로 마무리 됩니다.
1. Board class
/*
* Created on 2004. 10. 27.
* author : suny<skyfafa@gmail.com>
*/
package com.board.model;
public class Board {
// 모두 private 로 접근제한 됩니다.
private int sno = 0;
private int top = 0;
private String vno = null;
private String title = null;
private String id = null;
private String content = null;
private String navi = null;
public Board() { // constructor
}
public int getSno() { // getter
return sno;
}
public int getTop() { // getter
return top;
}
public String getVno() { // getter
return vno;
}
public String getContent() { // getter
return content;
}
public String getId() { // getter
return id;
}
public String getTitle() { // getter
return title;
}
public String getNavi() // getter
{
return navi;
}
public void setSno(int i) { // setter
sno = i;
}
public void setTop(int i) { // setter
top = i;
}
public void setVno(String vno) { // setter
this.vno = vno;
}
public void setContent(String string) { // setter
content = string;
}
public void setId(String string) { // setter
id = string;
}
public void setTitle(String string) { // setter
title = string;
}
public void setNavi(String navi) // setter
{
this.navi = navi;
}
public void reset() // reset
{
sno = 0;
top = 0;
vno = "";
title = "";
id = "";
content = "";
}
}
class 내용자체가 간단하므로, 별다른 설명이 필요없겠죠.. DB에서 query하는 데이터이건, 웹에서 입력한 데이터이건 Board class에 저장되어 Object로 Model , View , Controller 사이에서 서로 주고 받게 됩니다.
2. BoardDAO class
DB 관련 된 내용이 주가 되겠죠. 이번엔 우선 sql만 보도록 하죠. thread형 게시판로직은..
1 1 9999999999 test1
2 2 9999999998 test2 - 1씩 뺀다.
3 2 9999999998.3 [re]test2 - test2의 답글
4 2 9999999998.3.4 [re][re]test2 - [re]test2의 답글
5 5 9999999997 test3
6 6 9999999996 test4
7 1 9999999999.7 [re]test1 - test1의 답글
이런식으로 했습니다.
그러므로 desending sequence를 하나 생성했구요. 인덱스는 VNO 컬럼에 설정하였습니다.
private static String INSERT_QUERY = "INSERT INTO board ( sno , top , vno , id , title , content ) VALUES ( ? , ? , ? , ? , ? , ? )"; // 게시물 생성시 사용하는 query
private static String MAX_SNO_QUERY = "SELECT /*+ INDEX_DESC(board IDX_BOARD_PK) */ nvl(max(sno),0)+1 FROM board WHERE sno > 0"; // sno를 1씩 증가해서 새로운 게시물에 할당하는 query
private static String GET_VNO_QUERY = "SELECT seq_board.nextval FROM dual"; // 게시판 위치 표시 값을 시퀀스에서 하나 가져오는 query
private static String COUNT_QUERY = "SELECT count(*) FROM board WHERE sno > 0"; // 전체 게시물 개수 가져오는 query
private static String LIST_QUERY = "SELECT sno , vno , top , title , id FROM board WHERE vno >= ( SELECT vno FROM ( SELECT rownum rnum , vno FROM board WHERE vno > ' ' AND rownum <= ? ) WHERE rnum = ? ) AND rownum <= 10"; // 페이지 번호에 따른 해당 게시물 가져오는 query. 여기서 SELECT rownum rnum , vno FROM board WHERE vno > ' ' AND rownum <= ? 이부분에서 1페이지 이면 10개의 데이터를 가져오고, 2페이지면 20개를 가져오고, 100페이지면 1000개의 데이터를 가져오게 되어 있어서, 페이지가 늘어나면 늘어날 수록 가져오는 양이 많아 집니다. 그런데, plan상으로는 cost가 동일하더군요.. trace를 떠봐야 더 정확하게 알 수 있겠지만 암튼 query자체는 실제 테이블에 접근조차 하지 않기 때문에 성능상에는 문제가 없을 것으로 보여집니다.
private static String VIEW_QUERY = "SELECT sno , vno , top , title , id , content FROM board WHERE sno = ?"; // 게시물 상세 보기 query
private static String NEXT_PREV_QUERY = "SELECT sno , vno , top , 'NEXT' navi FROM board WHERE vno = ( SELECT /*+ index(board idx_board) */ vno FROM board WHERE vno > ? AND rownum <= 1 ) UNION ALL SELECT sno , vno , top , 'PREV' navi FROM board WHERE vno = ( SELECT /*+ index_desc(board idx_board) */ vno FROM board WHERE vno < ? AND rownum <= 1 )"; // 이전 , 다음 게시물 번호 가져오는 query
private static String DELETE_QUERY = "DELETE FROM board WHERE sno = ?"; // 게시물 삭제 query
쿼리들은 모두 부분범위처리가 적용되어 있고, driving set은 대부분(?) index access로 마무리 됩니다.
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2163 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1562 | ||
53 | [평일주간]100%환급,안드로이드,자바,C#,스프링3.2,SQL,힌트/튜… | 03-15 | 1351 | |
52 | [주말]C#,ASP.NET마스터 | 01-31 | 1468 | |
51 | [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… | 01-31 | 1543 | |
50 | [기업100%환급]Spring ,MyBatis,Hibernate실무과정(스프링개발자… | 01-31 | 1172 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1474 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1298 | |
47 | [주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate | 01-03 | 1803 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2163 | |
45 | [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… | 12-19 | 1564 | |
44 | [평일야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,Jav… | 12-14 | 1543 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1562 | |
42 | [주말, 평일야간]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBati… | 12-09 | 1251 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1473 | |
40 | [기업100%환급]자바기초&안드로이드개발자과정(Android전액환급… | 12-01 | 1609 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1121 |
댓글 없음:
댓글 쓰기