코딩항해기

[JSP] JDBC - DAO 템플릿 정리 본문

JSP (+JAVA Web)

[JSP] JDBC - DAO 템플릿 정리

miniBcake 2024. 8. 29. 22:48

 

 

 

 

[JSP] JDBCUtil 템플릿 정리

JDBC이긴한데 JSP에서 DB 연결할 때 사용하므로 JSP 카테고리에 정리했다.DB연결과 해제는 메서드로 만들어 사용하는 경우가 많고 그 형태가 패턴화되어있기 때문에 템플릿화된 코드라고 부른다. s

minibcake.tistory.com

 

DAO 부분도 고정된 형태로 진행되는 템플릿의 일종이라 한 번 정리한다.

로그는 Controller에서 최대한 DAO에 들어와 코드를 보는 일 없이 console로 확인할 수 있도록 설계했다.

현재 진행 중인 프로젝트의 boardDAO로 템플릿을 정리해보겠다.

 

package model.jiyoon;

public class BoardDAO {
	//쿼리선언
	private final String INSERT = "쿼리문";
	(생략)

	//고정 설정값이 있다면 선언
	private final int MINLIKE = 5;		//인기글 최소 기준
	private final int SHOWHOTBOARD = 3;	//보여줄 인기글 개수
	
	public boolean insert(BoardDTO boardDTO) {
		System.out.println("log: Board insert start");
		Connection conn = JDBCUtil.connect(); 
		PreparedStatement pstmt = null;
		try {
			pstmt = conn.prepareStatement(INSERT);
			pstmt.setString(1, boardDTO.getTitle()); 		//제목
			pstmt.setString(2, boardDTO.getContent()); 		//내용
			pstmt.setString(3, boardDTO.getVisibility()); 	//공개 비공개
			pstmt.setInt(4, boardDTO.getCategoryNum()); 	//카테고리 pk(fk)
			pstmt.setInt(5, boardDTO.getMemberNum()); 			//멤버 pk(fk)
			//넘어온 값 확인 로그
			System.out.println("log: parameter getTitle : "+boardDTO.getTitle());
			System.out.println("log: parameter getContent : "+boardDTO.getContent());
			System.out.println("log: parameter getVisibility : "+boardDTO.getVisibility());
			System.out.println("log: parameter getCategoryNum : "+boardDTO.getCategoryNum());
			System.out.println("log: parameter getMemberNum : "+boardDTO.getMemberNum());
			if(pstmt.executeUpdate() <= 0) { 
				//쿼리는 정상적으로 실행됐으나 실패
				System.err.println("log: Board insert execute fail");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("log: Board insert SQLException fail");
			return false;
		} catch (Exception e) {
			System.err.println("log: Board insert Exception fail");
			return false;
		} finally {
			//연결해제
			if(!JDBCUtil.disconnect(conn, pstmt)) {
				//연결해제 실패
				System.err.println("log: Board insert disconnect fail");
				return false;
			}
			System.out.println("log: Board insert end");
		}
		System.out.println("log: Board insert true");
		return true;
	}
	public boolean update(BoardDTO boardDTO) {
		System.out.println("log: Board update start");
		Connection conn = JDBCUtil.connect();
		PreparedStatement pstmt = null;
		try {
			pstmt = conn.prepareStatement(UPDATE);
			pstmt.setString(1, boardDTO.getTitle()); 		//제목
			pstmt.setString(2, boardDTO.getContent()); 		//내용
			pstmt.setString(3, boardDTO.getVisibility()); 	//공개 비공개
			pstmt.setInt(4, boardDTO.getBoardNum()); 		//게시물 pk
			//넘어온 값 확인 로그
			System.out.println("log: parameter getTitle : "+boardDTO.getTitle());
			System.out.println("log: parameter getContent : "+boardDTO.getContent());
			System.out.println("log: parameter getVisibility : "+boardDTO.getVisibility());
			System.out.println("log: parameter getBoardNum : "+boardDTO.getBoardNum());
			if(pstmt.executeUpdate() <= 0) { 
				//쿼리는 정상적으로 실행됐으나 실패
				System.err.println("log: Board update execute fail");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("log: Board update SQLException fail");
			return false;
		} catch (Exception e) {
			System.err.println("log: Board update Exception fail");
			return false;
		} finally {
			//연결해제
			if(!JDBCUtil.disconnect(conn, pstmt)) {
				//연결해제 실패
				System.err.println("log: Board update disconnect fail");
				return false;
			}
			System.out.println("log: Board update end");
		}
		System.out.println("log: Board update true");
		return true;
	}
	public boolean delete(BoardDTO boardDTO) {
		System.out.println("log: Board delete start");
		Connection conn = JDBCUtil.connect();
		PreparedStatement pstmt = null;
		try {
			pstmt = conn.prepareStatement(DELETE);
			pstmt.setInt(1, boardDTO.getBoardNum()); //게시글 pk
			//넘어온 값 확인 로그
			System.out.println("log: parameter getBoardNum : "+boardDTO.getBoardNum());
			if(pstmt.executeUpdate() <= 0) { 
				//쿼리는 정상적으로 실행됐으나 실패
				System.err.println("log: Board delete execute fail");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("log: Board delete SQLException fail");
			return false;
		} catch (Exception e) {
			System.err.println("log: Board delete Exception fail");
			return false;
		} finally {
			//연결해제
			if(!JDBCUtil.disconnect(conn, pstmt)) {
				//연결해제 실패
				System.err.println("log: Board delete disconnect fail");
				return false;
			}
			System.out.println("log: Board delete end");
		}
		System.out.println("log: Board delete true");
		return true;
	}
	public ArrayList<BoardDTO> selectAll(BoardDTO boardDTO) {
		System.out.println("log: Board selectAll start");
		ArrayList<BoardDTO> datas = new ArrayList<>();
		Connection conn = JDBCUtil.connect();
		PreparedStatement pstmt = null;
		try {
			if(boardDTO.getCondition().equals("ALL")) {
				//- 게시판 별 목록
				System.out.println("log: Board selectAll condition : SELECTALL");
				pstmt = conn.prepareStatement(SELECTALL);
				pstmt.setString(1, boardDTO.getCategoryName()); 	//카테고리 명
				pstmt.setInt(2, boardDTO.getStartNum());			//페이지네이션 시작번호
				pstmt.setInt(3, boardDTO.getEndNum());				//페이지네이션 끝번호	
				//넘어온 값 확인 로그
				System.out.println("log: parameter getCategoryName : "+boardDTO.getCategoryName());
				System.out.println("log: parameter getStartNum : "+boardDTO.getStartNum());
				System.out.println("log: parameter getEndNum : "+boardDTO.getEndNum());
			}
			else if(boardDTO.getCondition().equals("HOT_SELECTALL")) {
				//- 게시판 별 인기글 3개
				System.out.println("log: Board selectAll condition : SELECTALL_HOT");
				pstmt = conn.prepareStatement(SELECTALL_HOT);
				pstmt.setString(1, boardDTO.getCategoryName()); 	//카테고리 명
				pstmt.setInt(2, MINLIKE);							//인기글 최소 기준
				pstmt.setInt(3, SHOWHOTBOARD); 						//보여줄 인기글 개수
				//넘어온 값 확인 로그
				System.out.println("log: parameter getCategoryName : "+boardDTO.getCategoryName());
			}
			else if(boardDTO.getCondition().equals("TITLE_SELECTALL")) {
				//- 검색 기능 (제목)
				System.out.println("log: Board selectAll condition : SELECTALL_TITLE");
				pstmt = conn.prepareStatement(SELECTALL_TITLE);
				pstmt.setString(1, boardDTO.getCategoryName()); 	//카테고리 명
				pstmt.setString(2, boardDTO.getKeyword());			//검색어
				pstmt.setInt(3, boardDTO.getStartNum());			//페이지네이션 시작번호
				pstmt.setInt(4, boardDTO.getEndNum());				//페이지네이션 끝번호	
				//넘어온 값 확인 로그
				System.out.println("log: parameter getCategoryName : "+boardDTO.getCategoryName());
				System.out.println("log: parameter getKeyword : "+boardDTO.getKeyword());
				System.out.println("log: parameter getStartNum : "+boardDTO.getStartNum());
				System.out.println("log: parameter getEndNum : "+boardDTO.getEndNum());
			}
			else {
				//일치하는 컨디션값을 찾지 못했을 때
				System.err.println("log: Board selectAll condition fail");
			}
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) { 
				BoardDTO data = new BoardDTO();
				data.setBoardNum(rs.getInt("BOARD_NUM"));						//게시글 pk
				data.setTitle(rs.getString("BOARD_TITLE"));						//제목
				data.setContent(rs.getString("BOARD_CONTENT"));					//내용
				data.setVisibility(rs.getString("BOARD_VISIBILITY"));			//공개 비공개
				data.setCategoryNum(rs.getInt("BOARD_CATEGORY"));				//카테고리 pk(fk)
				data.setCategoryName(rs.getString("CATEGORY_NAME"));			//카테고리 명
				data.setMemberNum(rs.getInt("MEMBER_NUM"));	 					//작성자 pk(fk)
				data.setMemberNickname(rs.getString("MEMBER_NICKNAME"));		//작성자 닉네임
				data.setLikeCnt(rs.getInt("LIKE_COUNT")); 						//좋아요 수 
				data.setWriteDay(rs.getString("BOARD_WRITE_DAY")); 				//작성일자
				//반환된 객체 리스트에 추가
				datas.add(data); 
				System.out.print("result "+data.getCategoryNum()+" | ");
			}
			rs.close();
			System.out.println("end");
		} catch (SQLException e) {
			System.err.println("log: Board selectAll SQLException fail");
			datas.clear();//잔여데이터 삭제
		} catch (Exception e) {
			System.err.println("log: Board selectAll Exception fail");
			datas.clear();//잔여데이터 삭제
		} finally {
			//연결해제
			if(!JDBCUtil.disconnect(conn, pstmt)) {
				//연결해제 실패
				System.err.println("log: Board selectAll disconnect fail");
				datas.clear();//잔여데이터 삭제
			}
			System.out.println("log: Board selectAll end");
		}
		System.out.println("log: Board selectAll return datas");
		return datas;
	}
	public BoardDTO selectOne(BoardDTO boardDTO) {
		BoardDTO data = null;
		System.out.println("log: Board selectOne start");
		ArrayList<BoardDTO> datas = new ArrayList<>();
		Connection conn = JDBCUtil.connect();
		PreparedStatement pstmt = null;
		try {
			if(boardDTO.getCondition().equals("ONE")) {
				//- 게시글 상세 조회
				System.out.println("log: Board selectOne condition : SELECTONE");
				pstmt = conn.prepareStatement(SELECTONE);
				pstmt.setInt(1, boardDTO.getBoardNum()); 			//게시글 번호
				//넘어온 값 확인 로그
				System.out.println("log: parameter getBoardNum : "+boardDTO.getBoardNum());
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) { 
					data = new BoardDTO();
					data.setBoardNum(rs.getInt("BOARD_NUM"));				//게시글 pk
					data.setTitle(rs.getString("BOARD_TITLE"));				//제목
					data.setContent(rs.getString("BOARD_CONTENT"));			//내용
					data.setVisibility(rs.getString("BOARD_VISIBILITY"));	//공개 비공개
					data.setCategoryNum(rs.getInt("BOARD_CATEGORY"));		//카테고리 pk(fk)
					data.setCategoryName(rs.getString("CATEGORY_NAME"));	//카테고리 명
					data.setMemberNum(rs.getInt("MEMBER_NUM"));	 			//작성자 pk(fk)
					data.setMemberNickname(rs.getString("MEMBER_NICKNAME"));//작성자 닉네임
					data.setLikeCnt(rs.getInt("LIKE_COUNT")); 				//좋아요 수 
					data.setWriteDay(rs.getString("BOARD_WRITE_DAY")); 		//작성일자
					System.out.println("result true");
				}
				rs.close();
			}
			else if(boardDTO.getCondition().equals("CNT")) {
				//- 게시판 별 글 개수
				System.out.println("log: Board selectOne condition : SELECTONE_CNT");
				pstmt = conn.prepareStatement(SELECTONE_CNT);
				pstmt.setString(1, boardDTO.getCategoryName()); 			//카테고리 명
				//넘어온 값 확인 로그
				System.out.println("log: parameter getCategoryName : "+boardDTO.getCategoryName());
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) { 
					data = new BoardDTO();
					data.setBoardCnt(rs.getInt("B_CNT"));			//게시판 별 게시글 총 개수
					System.out.println("result true");
				}
				rs.close();
			}
			else if(boardDTO.getCondition().equals("CNTCONTENTS")) {
				//- 게시판 별 내용 검색 글 개수
				System.out.println("log: Board selectOne condition : SELECTONE_CONTENT_CNT");
				pstmt = conn.prepareStatement(SELECTONE_CONTENT_CNT);
				pstmt.setString(1, boardDTO.getCategoryName()); 			//카테고리 명
				pstmt.setString(2, boardDTO.getKeyword()); 					//검색어
				//넘어온 값 확인 로그
				System.out.println("log: parameter getCategoryName : "+boardDTO.getCategoryName());
				System.out.println("log: parameter getKeyword : "+boardDTO.getKeyword());
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) { 
					data = new BoardDTO();
					data.setBoardCnt(rs.getInt("B_CNT"));			//게시판 별 게시글 총 개수
					System.out.println("result true");
				}
				rs.close();
			}
			else {
				//일치하는 컨디션값을 찾지 못했을 때
				System.err.println("log: Board selectOne condition fail");
			}
			System.out.println("end");
		} catch (SQLException e) {
			System.err.println("log: Board selectOne SQLException fail");
			datas.clear();//잔여데이터 삭제
		} catch (Exception e) {
			System.err.println("log: Board selectOne Exception fail");
			datas.clear();//잔여데이터 삭제
		} finally {
			//연결해제
			if(!JDBCUtil.disconnect(conn, pstmt)) {
				//연결해제 실패
				System.err.println("log: Board selectOne disconnect fail");
				datas.clear();//잔여데이터 삭제
			}
			System.out.println("log: Board selectOne end");
		}
		System.out.println("log: Board selectOne return datas");
		return data;
	}
}