Joslynn의 하루

MSA Full-Stack 개발자 양성 과정 -29일차 노트 필기_ 게시판 만들기 실습(오류코드 정리) _220831 본문

MSA Full-Stack 개발자 양성과정/데이터베이스(Oracle)

MSA Full-Stack 개발자 양성 과정 -29일차 노트 필기_ 게시판 만들기 실습(오류코드 정리) _220831

Joslynn 2022. 9. 1. 02:38

게시판 만들기 실습

 

**오류 정리하기

작성 코드)

Class BoardDAO{

	public BoardDTO replySelectByParentNo(int boardNo) throws SQLException {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = proFile.getProperty("reply.selectByboardNo");
		BoardDTO board = this.boardSelectByNo(boardNo);
		List<ReplyDTO> list = new ArrayList<ReplyDTO>();
		
		try {
			con = DbUtil.getConnection();
			ps = con.prepareStatement(sql);
			ps.setInt(1, boardNo);
			
			rs = ps.executeQuery();
			while(rs.next()) {
				list.add(new ReplyDTO(rs.getInt(1), rs.getString(2), rs.getInt(3), 
                		              rs.getString(4)));	
			}
			board.setRepliesList(list);
			
		} finally {
			DbUtil.dbClose(con, ps, rs);
		}
		return board;
	}

}

 

 

수정 코드)

Class BoardDAO{
/**
	 * 게시글번호로 댓글 조회하기
	 * 같은 connection을 유지해야 중간에 해당 게시글 삭제 등의 변화가 있어도
      현재 세션의 댓글 조회에 오류가 일어나지 않음;
	 * */ 
     
	@Override
	public BoardDTO replySelectByParentNo(int boardNo) throws SQLException {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = proFile.getProperty("board.selectByNo");
		List<ReplyDTO> list = new ArrayList<ReplyDTO>();
		BoardDTO board = null;
		
			try {
				con = DbUtil.getConnection();
				ps = con.prepareStatement(sql);
				ps.setInt(1, boardNo);
				rs = ps.executeQuery();
				if (rs.next()) {
					board = new BoardDTO(rs.getInt(1), rs.getString(2), rs.getString(3), 
                    					 rs.getString(4), rs.getString(5));
					list = this.replyselect(con, boardNo);
					board.setRepliesList(list);
				}
			} finally {
				DbUtil.dbClose(con, ps, rs);
			}
			
		return board;
	}
	
	public List<ReplyDTO> replyselect(Connection con, int boardNo) throws SQLException { 
    // 같은 Connection 유지
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = proFile.getProperty("reply.selectByboardNo");
		List<ReplyDTO> list = new ArrayList<ReplyDTO>();

		ps = con.prepareStatement(sql);
		ps.setInt(1, boardNo);
		rs = ps.executeQuery();
		
		while(rs.next()) {
			list.add(new ReplyDTO(rs.getInt(1), rs.getString(2), rs.getInt(3), 
            					  rs.getString(4)));	
		}
		return list;
	}
 
}

수정한 이유

: 게시글 번호를 통해 해당 게시글을 검색하는 기능과 게시글에 달린 댓글을 조회하는 기능이 같은 Connection을 유지해야 하기 때문이다.

: 같은 Connection이 유지되지 않을 경우, 실시간으로 유저들이 이용하는 인터넷 공간에서 해당 게시글을 검색한 후, 댓글 조회를 하는 짧은 순간동안 글이 삭제될 수도 있다. 이럴 경우, 같은 Connection을 유지하고 있지 않아 에러가 발생할 수 있다.

 

Comments