위로 아래

조회수 증가

게시글을 클릭해 게시글 보기를 진행할 때마다 readcount 데이터 값을 1씩 올리려고 한다.

 

게시글을 불러올 때 이루어져야 하는 작업이니, BoardDAO 중에서 getArticle 메소드를 확인해보자.

 

public BoardDTO getArticle(int bno) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    int r = 0;
    BoardDTO dto = new BoardDTO();

    try {
        String sql = "SELECT bno, bref, bstep, blevel, readcount, "
                + "subject, content, writer, regdate, ip, passwd "
                + "FROM board WHERE bno = ?";
        conn = DBConnectionManager.getInstance().getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, bno);
        rs = pstmt.executeQuery();
        if(rs.next()) {
            dto.setBno(rs.getInt("bno"));
            dto.setBref(rs.getInt("bref"));
            dto.setBstep(rs.getInt("bstep"));
            dto.setBlevel(rs.getInt("blevel"));
            dto.setReadcount(rs.getInt("readcount"));
            dto.setSubject(rs.getString("subject"));
            dto.setWriter(rs.getString("writer"));
            dto.setContent(rs.getString("content"));
            dto.setRegdate(rs.getString("regdate"));
            dto.setIp(rs.getString("ip"));
            dto.setPasswd(rs.getString("passwd"));
        }

	// 여기

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if(conn != null) conn.close();
            if(pstmt != null) pstmt.close();
            if(rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    return dto;
}
}

 

 

try 문 안에서 게시글을 모두 불러온 후, catch로 넘어가기 전에 들어가는 것이 가장 이상적일 것 같다.

데이터베이스의 데이터를 직접 바꿔야 하므로 SQL문 중 UPDATE를 이용한다.

sql = "UPDATE board SET readcount=readcount+1 WHERE bno =?";

 

이를 실행하면 다음과 같다.

sql = "UPDATE board SET readcount=readcount+1 WHERE bno =?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, bno);
r  = pstmt.executeUpdate();

 

 

 

오류 방지

오류를 방지하기 위해,

위의 sql문은 bno 값이 있을 때에만 진행되도록 처리하고,

한 메소드에서 두 번의 쿼리문 작업을 처리하고 있으니, 먼저 사용한 pstmt와 rs는 초기화해준다.

 

pstmt.close();
rs.close();

if(dto.getBno()!=0 && dto!=null) {
    sql = "UPDATE board SET readcount=readcount+1 "
            + "WHERE bno =?";
    pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, bno);
    r  = pstmt.executeUpdate();
}

 

 

이제 조회수가 늘어나는 모습을 확인할 수 있다.

 

 

 

 


전체 코드

더보기
public BoardDTO getArticle(int bno) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    int r = 0;
    BoardDTO dto = new BoardDTO();

    try {
        String sql = "SELECT bno, bref, bstep, blevel, readcount, "
                + "subject, content, writer, regdate, ip, passwd "
                + "FROM board WHERE bno = ?";
        conn = DBConnectionManager.getInstance().getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, bno);
        rs = pstmt.executeQuery();
        if(rs.next()) {
            dto.setBno(rs.getInt("bno"));
            dto.setBref(rs.getInt("bref"));
            dto.setBstep(rs.getInt("bstep"));
            dto.setBlevel(rs.getInt("blevel"));
            dto.setReadcount(rs.getInt("readcount"));
            dto.setSubject(rs.getString("subject"));
            dto.setWriter(rs.getString("writer"));
            dto.setContent(rs.getString("content"));
            dto.setRegdate(rs.getString("regdate"));
            dto.setIp(rs.getString("ip"));
            dto.setPasswd(rs.getString("passwd"));
        }
        pstmt.close();
        rs.close();

        if(dto.getBno()!=0 && dto!=null) {
            sql = "UPDATE board SET readcount=readcount+1 "
                    + "WHERE bno =?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, bno);
            r  = pstmt.executeUpdate();
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if(conn != null) conn.close();
            if(pstmt != null) pstmt.close();
            if(rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    return dto;
}