조회수(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가 필요한데
본 예제에서는 사용자 관련 기능을 다루지 않기 때문에 구현하지 않는다.
각자 구현해 본다면 실력 향상에 도움이 될 것이다.
'Java > 게시판 2' 카테고리의 다른 글
1. 게시판 확장 - 준비 (0) | 2016.03.28 |
---|---|
2. 게시판 확장 - 글쓰기와 수정을 하나로 (0) | 2016.03.28 |
4. 게시판 확장 - 삭제에서 숨기기로 (0) | 2016.03.28 |
5. 게시판 확장 - 페이징 (10) | 2016.03.20 |