개발자가 되고 싶은 조안나

[Java] 게시판 만들기 (조회수기능) 본문

코드 정리

[Java] 게시판 만들기 (조회수기능)

햇병아리개발자 2019. 8. 18. 17:27

read_cntVO를 만들어 준다. 

처음에 조금 헤맸던게 조회수 VO 하나를 여러 게시판이 나눠 쓸 수 있는 줄 알았는데 

한 게시판에 하나씩 만들어 줘야한다. 

package read_cnt;

import cmn.DTO;

public class ReadCntVO extends DTO{
	/*ip주소*/
	private String ip;
	/*클릭한 게시글 번호*/
	private String seq;
	/*등록 날짜*/
	private String red_dt;
	
	public ReadCntVO(){}
}

이 후에는 기존에 만들어두었던 reviewDao에 새로 쿼리를 추가 

//조회수 증가 
		public int do_updateReadCnt(DTO dto) {
			ReviewVO vo=(ReviewVO)dto;
			int flag=0;
			Connection conn = null;
			PreparedStatement pstmt = null;
			try{
				StringBuilder sb = new StringBuilder();
				sb.append(" update board2                                                    \n");
				sb.append(" set read_cnt = (SELECT NVL(read_cnt,0)+1 FROM board2 WHERE seq=?)\n");
				sb.append(" WHERE seq=?                                                      \n");
				
				conn= connectionMaker.getConnection();
				LOG.debug("1.===========================");
				LOG.debug("1.query\n"+sb.toString());
				LOG.debug("1.===========================");
				
				pstmt = conn.prepareStatement(sb.toString());
				pstmt.setString(1, vo.getSeq());
				pstmt.setString(2, vo.getSeq());
				LOG.debug("2.===========================");
				LOG.debug("2.param:"+vo);
				LOG.debug("2.===========================");
				
				flag=pstmt.executeUpdate();
				LOG.debug("3.===========================");
				LOG.debug("3.flag:"+flag);
				LOG.debug("3.===========================");
				
			}catch(SQLException s){
				LOG.debug("==========================");
				LOG.debug("SQLException="+s.toString());
				LOG.debug("==========================");
				
			}finally{
				JDBCReturnReso.close(pstmt);
				JDBCReturnReso.close(conn);
			}
					
			return flag;
		}

 

	//클릭한 횟수
	public int do_retSelectCnt(DTO dto){
		ReadCntVO2 vo =(ReadCntVO2) dto;
		int flag = 0;
		Connection conn = null;
		PreparedStatement pstmt= null;
		ResultSet rs = null;
		try{
			StringBuilder sb=new StringBuilder();
			sb.append(" SELECT COUNT(*) cnt \n");
			sb.append(" FROM read_cnt2      \n");
			sb.append(" WHERE  seq2 = ?      \n");
			conn = connectionMaker.getConnection();
			LOG.debug("1.============================");
			LOG.debug("1.query: \n"+sb.toString());
			LOG.debug("1.============================");
			
			pstmt = conn.prepareStatement(sb.toString());
			//query param
			pstmt.setString(1, vo.getSeq());
			LOG.debug("2.============================");
			LOG.debug("2.param seq="+vo.getSeq());
			LOG.debug("2.============================");			
			
			rs = pstmt.executeQuery();
			
			if(rs.next()){
				flag = rs.getInt("cnt");
			}
			LOG.debug("3.============================");
			LOG.debug("3.flag="+flag);
			LOG.debug("3.============================");			
						
			
		}catch(SQLException e){
			LOG.debug("===================");
			LOG.debug("SQLException="+e.getMessage());
			LOG.debug("===================");
		}finally{
			JDBCReturnReso.close(rs);
			JDBCReturnReso.close(pstmt);
			JDBCReturnReso.close(conn);
		}
		
		return flag;
	}
//ip등록
	public int do_retInsert(DTO dto) {
		ReadCntVO2 vo =(ReadCntVO2)dto;
		int flag=0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		try{
			StringBuilder sb = new StringBuilder();
			sb.append(" INSERT INTO read_cnt2 (  \n");
			sb.append("     seq2,                \n");
			sb.append("     ip,                 \n");
			sb.append("     red_dt              \n");
			sb.append(" ) VALUES (              \n");
			sb.append("     ?,				    \n");
			sb.append("     ?,                  \n");
			sb.append("     SYSDATE             \n");
			sb.append(" )                       \n");
			
			//오류나면 꺼낼 수 있도록 로그 만들기
			LOG.debug("1.=========================");
			LOG.debug("1.query\n:"+sb.toString());
			LOG.debug("1.=========================");
			
			//커넥션 만들기
			conn = connectionMaker.getConnection();
			pstmt= conn.prepareStatement(sb.toString());
			//파람 3개설정(물음표 2개임)
			pstmt.setString(1, vo.getSeq());
			pstmt.setString(2, vo.getIp());
			LOG.debug("2.=========================");
			LOG.debug("2.param\n:"+vo.toString());
			LOG.debug("2.=========================");
			
			//쿼리날리기
			flag = pstmt.executeUpdate();
			LOG.debug("3.=========================");
			LOG.debug("3.flag\n:"+flag);
			LOG.debug("3.=========================");
				
		}catch(SQLException e){
			LOG.debug("=========================");
			LOG.debug("SQLException"+e.toString());
			LOG.debug("=========================");
			
		}finally{
			JDBCReturnReso.close(pstmt);
			JDBCReturnReso.close(conn);	
		}
		
		return flag;
	}

이렇게 만들고 나서도 조금 문제가 있었는데. 

바로 게시물을 삭제하고 나면 ORA-02292: 무결성 제약조건

'자식레코드가 발견되었습니다'라는 알람이 뜨는 것이다. 

아까는 부모가 없다고 그러고.. 이번에는 자식이 발견되었다니 

 

FK로 연결된 자식테이블에 데이터가 존재하기 때문이라는데

무슨 소리인고 하니. 게시판에 있는 게시글(부모)은 지워졌는데

조회수(자식) 정보는 남아있어서 그렇다고 한다.

 

이런 경우에는 빌더에 들어가서 외래키->종속 삭제로 바꿔줘야한다.

부모 죽으면 자식도 같이 사라지도록 casecade로 바꿔주면 끝!

정처기 시험공부할 때 casecade 뜻만 외웠지 사실

제대로 이해 못했었는데 이런데 필요한거였구나 하고

퍼즐 맞춰지는 기분이 들어서 좋았다.

 

Comments