2014년 10월 14일 화요일

[chapter 3] 게시판 Model 작성[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

 이번에는 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로 마무리 됩니다.

 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272163
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111562
53 [평일주간]100%환급,안드로이드,자바,C#,스프링3.2,SQL,힌트/튜… 오라클자바…03-151351
52 [주말]C#,ASP.NET마스터 오라클자바…01-311468
51 [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… 오라클자바…01-311543
50 [기업100%환급]Spring ,MyBatis,Hibernate실무과정(스프링개발자… 오라클자바…01-311172
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191474
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111298
47 [주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate 오라클자바…01-031803
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272163
45 [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… 오라클자바…12-191564
44 [평일야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,Jav… 오라클자바…12-141543
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111562
42 [주말, 평일야간]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBati… 오라클자바…12-091251
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011473
40 [기업100%환급]자바기초&안드로이드개발자과정(Android전액환급… 오라클자바…12-011609
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011121

댓글 없음:

댓글 쓰기