Jsp-MVC2 -DAO

2020. 8. 10. 19:59JSP-MVC model2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package dao;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import vo.BoardDTO;
import static db.JdbcUtil.*;
 
public class BoardDAO {
    
    //------------------BoardDAO 인스턴스 생성 및 리턴을 위한 싱글톤 패턴--------------------
    private  BoardDAO () {}
    
    private static BoardDAO instance;
    
    public static BoardDAO getInstance() {
        // 기존 BoardDAO 인스턴스가 없을 때만 생성하고, 있을 경우 생성하지 않음
        if(instance == null) {
            instance = new BoardDAO();
        }
        return instance;
    }
    //-----------------------------------------------------------------------
    // Service 클래스로부터 jdbcUtil 에서 제공받은 Connection 객체를 전달받기
    Connection con;
 
    public void setConnection(Connection con) {
        this.con = con;
    }
    //----------------------------------준비 작업 끝!-------------------------------------
    
    //글 쓰기 작업 수행을 위한 insertArticle() 메서드 정의
    //파라미터 : BoardDTO 객체(Article), 리턴타입 : int(insertCount)
    public int insertArticle(BoardDTO article) {
        // 새 게시물 저장을 위해 현재 게시물 최대 글번호를 조회 후
        // 새 게시물 번호를 최대 글번호 +1 을 하려 INSERT 작업 수행 후 결과를 리턴
        int insertCount=0;//INSERT 작업 결과를 저장할 변수
        
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        
        try {
            // 새 게시물 번호 생성을 위해 기존 게시물 중 최대 글번호 조회
            String sql="select max(board_num) from board";
            pstmt=con.prepareStatement(sql);
            rs=pstmt.executeQuery();
            
            // 조회된 글 번호가 있을 경우 해당 글 번호 + 1 을  새 글번호로 지정
            int num=1;// 새 글번호를 저장할 변수
            if(rs.next()) {
                num=rs.getInt(1)+1;
            }
            
            //board 테이블에 전달받은 게시물 정보 INSERT 작업 수행
            sql="insert into board values(?,?,?,?,?,?,?,?,?,?,now())";
            pstmt=con.prepareStatement(sql);
            pstmt.setInt(1, num);//글번호
            pstmt.setString(2, article.getBoard_name());//작성자
            pstmt.setString(3, article.getBoard_pass());//패스워드
            pstmt.setString(4, article.getBoard_subject());//제목
            pstmt.setString(5, article.getBoard_content());//내용
            pstmt.setString(6, article.getBoard_file());//파일명
            pstmt.setInt(7, num);//참조글 번호-> 원본글이므로 글번호로 지정
            pstmt.setInt(80);//들여쓰기 레벨 -> 원본글이므로 들여쓰기 없음
            pstmt.setInt(90);// 글 순서 번호 -> 원본글이므로 0으로 지정
            pstmt.setInt(100);//조회수
            
            // SQL 구문 실행 및 결과값을 int 형으로 리턴 받기
            insertCount=pstmt.executeUpdate();
        } catch (SQLException e) {
//            e.printStackTrace();
            System.out.println("BoardDAO - insertArticle() 에러! : "+e.getMessage());
        }finally {
            //PreparedStatement , ResultSet 객체 반환
            close(pstmt);//JdbcUtil.close(pstmt);
            close(rs);//JdbcUtil.close(rs);
        }
        
        
        
        return insertCount;
    }
    
    // 전체 게시글 수를 불러오기 위한 메서드 정의
    public int selectListCount() {
        int listCount=0;
        PreparedStatement pstmt=null;
        ResultSet rs= null;
        
        try {
            String sql="select count(*) from board";
            pstmt=con.prepareStatement(sql);
            rs=pstmt.executeQuery();
            if(rs.next()) {
                
                // 게시물 수가 조회될 경우(게시물이 하나라도 존재할 경우)
                // listCount 에 조회된 게시물 수 저장
                listCount=rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
            close(rs);
        }
        
        
        
        return listCount;
    }
    
    // 전체 게시물 목록 조회
    public ArrayList<BoardDTO> getArticleList(int page,int limit){
        ArrayList<BoardDTO> articleList=new ArrayList<BoardDTO>();
        
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        
        try {
            //board 테이블의 모든 레코드 조회
            // 정렬(order by) : board_re_ref 기준 내림차순, board_re_seq 기준 오름차순
            // 제한(limit) : 0번 레코드부터 limit 개
            
            // 읽어올 시작 레코드 번호 계산
            // 현재 페이지번호에서 1을 뺀 결과에 10을 곱하면 시작 레코드 번호
            int startRow=(page-1)*10;
            String sql="select * from board order by re_ref desc re_seq asc limit ?,?";
            pstmt=con.prepareStatement(sql);
            pstmt.setInt(1, startRow);
            pstmt.setInt(2, limit);
            rs=pstmt.executeQuery();
            
            //조회된 레코드가 존재할 경우 BoardDTO 객체에 레코드 정보 저장 및
            // ArrayList 객체에 BoardDTO 객체 추가 작업 반복
            while(rs.next()) {
                BoardDTO dto=new BoardDTO();
                dto.setBoard_content(rs.getString("board_content"));
                dto.setBoard_date(rs.getTimestamp("board_date"));
                dto.setBoard_file(rs.getString("board_file"));
                dto.setBoard_name(rs.getString("board_name"));
                dto.setBoard_num(rs.getInt("board_num"));
                dto.setBoard_readcount(rs.getInt("board_readcount"));
                dto.setBoard_subject(rs.getString("board_subject"));
                dto.setRe_lev(rs.getInt("re_lev"));
                dto.setRe_ref(rs.getInt("re_ref"));
                dto.setRe_seq(rs.getInt("re_seq"));
                
                articleList.add(dto);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(pstmt);
            close(rs);
        }
        
        return articleList;
    }
    
}
 
cs

 

DAO 작업을 위한 클래스를 하나 생성해주고 여기서는 DAO 작업만 할 수 있게 로직을 만들면 된다.

Context.xml 에서 Connection Pool을 선언해 준 것을 여기서 불러서 가져다 쓰면 된다.

나머지 DAO작업들은 MVC2라고 다를건 없고 리턴 타입의 필요성이 좀 강조될 뿐인 것 같다.

아무래도 전부 모듈화를 시켜 떨어 뜨려 놓았으니 작업을 했다는 걸 리턴 타입으로 값을 넘겨주면서 작업이 성공한 것인지 아닌지 확인을 해야 하기 때문인 것 같다. 그리고 모듈화를 시켰으니 다른 곳에서의 접근을 차단하기 위해서 SingltonDisginPattern으로 만들어 주었다.

'JSP-MVC model2' 카테고리의 다른 글

Jsp-MVC2-WriteProAction  (0) 2020.08.10
Jsp-MVC2-JdbcUtil  (0) 2020.08.10
Jsp -MVC2- Action,ActionForward  (0) 2020.08.10
Jsp-MVC2-FrontController  (0) 2020.08.10
Jsp-MVC2,Connection Pool  (0) 2020.08.10