조회수(BRDHIT)는 사용자가 글을 읽은 회수를 의미하며,

구현은 글 읽기가 호출되면 해당 글의 조회수를 1씩 증가(BRDHIT = BRDHIT + 1)시켜서 구현한다.

그리고, 리스트에서 그 값을 볼 수 있게 해주면 된다.




먼저, 조회수를 증가 시켜주는 다음과 같은 SQL문과 서비스를 작성한다(board2Svc.java).

<update id="updateBoard2Read" parameterType="String">
        UPDATE TBL_BOARD
              SET BRDHIT = BRDHIT + 1
         WHERE BRDNO=#{brdno}
</update>

Board2.xml

public void updateBoard2Read(String param) throws Exception {
    sqlSession.update("updateBoard2Read", param);
}

board2Svc.java

이 서비스(SQL)를 아래와 같이 글 읽기 컨트롤에서 호출하면 된다.

@RequestMapping(value = "/board2Read")
public String boardSave(HttpServletRequest request, ModelMap modelMap) throws Exception {
    String brdno = request.getParameter("brdno");
       
    boardSvc.updateBoard2Read(brdno);
    boardVO boardInfo = boardSvc.selectBoardOne(brdno);
    modelMap.addAttribute("boardInfo", boardInfo);
       
    return "board2/boardRead";
}

board2Ctr.java

이렇게 하여 사용자가 글을 읽을 때 마다 조회수를 증가시키게 된다.

이렇게 하여 증가된 조회수는 리스트에 다음의 코드를 추가하여 볼 수 있다.

즉 SELECT문으로 조회수(BRDHIT) 값을 가져오고,

<select id="selectBoard2List" resultType="gu.board2.boardVO" parameterType="gu.common.PageVO">
    SELECT BRDNO, BRDTITLE, BRDWRITER, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE, BRDHIT
      FROM TBL_BOARD
     WHERE BRDDELETEFLAG='N'
     ORDER BY BRDNO DESC
</select>

board2.xml

사용자에게 보여 주는 JSP에서 다음과 같이 출력하면 된다.

<thead>

                                <tr>

                                          <th>번호</th>

                                          <th>제목</th>

                                          <th>등록자</th>

                                          <th>등록일</th>

                                          <th>조회수</th>

                                </tr>

                     </thead>

                     <tbody>

                                <c:forEach var="listview" items="${listview}" varStatus="status">      

                                          <c:url var="link" value="board2Read">

                                                     <c:param name="brdno" value="${listview.brdno}" />

                                          </c:url>           

                                          <tr>

                                                     <td><c:out value="${listview.brdno}"/></td>

                                                     <td><a href="${link}"><c:out value="${listview.brdtitle}"/></a></td>

                                                     <td><c:out value="${listview.brdwriter}"/></td>

                                                     <td><c:out value="${listview.brddate}"/></td>

                                                     <td><c:out value="${listview.brdhit}"/></td>

                                          </tr>

                                </c:forEach>

                     </tbody>

boardList.jsp

이상의 과정으로 조회수 기능 추가는 끝인데, 이렇게만 두면 오작동할 수 있다.

다음과 같이 글 작성(Inset)시 추가한 두 개의 필드에 대한 값을 처리해 줘야 한다.

즉, 처음 쓰는 글이니 조회수는 0, 삭제되지 않았으니 N(no)을 넣어 준다.

테이블 생성시 Default 값으로 처리하는 것이 편하지만,

개인적으로 직관적인 것을 선호해서 Default처리를 잘 하지 않는다.

<insert id="insertBoard2" parameterType="gu.board2.boardVO" >
        INSERT INTO TBL_BOARD(BRDTITLE, BRDWRITER, BRDMEMO, BRDDATE, BRDHIT, BRDDELETEFLAG)
    VALUES (#{brdtitle}, #{brdwriter}, #{brdmemo}, NOW(), 0, 'N' )
</insert>

좀 더 나은 조회수 처리는 중복 데이터 방지일 것이다.

즉, 동일한 사람이 두 번 이상 읽은 경우 한번으로 처리하는 것이다.

별도의 테이블을 이용하여 해당 글을 읽은 사람의 이름(ID)를 저장하면 된다.

이 기능은 사용자 ID가 필요한데

본 예제에서는 사용자 관련 기능을 다루지 않기 때문에 구현하지 않는다.

각자 구현해 본다면 실력 향상에 도움이 될 것이다.







+ Recent posts