저번장에서는 해당 게시물에 대한 조회수를 나타나게 하는 기능을 추가했습니다.

이번장은 해당 게시물에 있는 댓글을 게시판 목록의 제목옆에 댓글 수를 출력해보도록 하겠습니다.

 

select count(reply_number)
from reply
where board_number= 4;

 

해당 쿼리를 조회하면 4번 게시물에 달린 댓글의 수를 구할 수 있습니다.

이 댓글의 수를 board 테이블의 reply_count 컬럼에 저장 시켜야 합니다.

 

하지만 저희의 DB에는 reply_count 컬럼이 없기 때문에 추가하도록 하겠습니다.

 

alter table board add reply_count int DEFAULT '0';

 

컬럼을 추가했으니 BoardVO 에도 만들어줘야 하겠죠?

 

// BoardVO 추가 후 getter, setter 추가

private int reply_count;

 

댓글의 개수를 구한 후에 reply_count에 값을 저장시켜야 하는데요

서브쿼리를 이용하여 해당 글 번호의 댓글 수를 구한 후

업데이트 시키겠습니다.

 

일단 DB에서 테스트 해볼까요?

 

 

정상적으로 서브쿼리로 조회한 결과를 board 테이블에 reply_count로 업데이트 되었습니다.

 

이제 boardMapper.xml에 추가하도록 하겠습니다.

 

1. boardMapper.xml 추가

 

<update id="updateReplyCount" parameterType="int">
	update board b
	set b.reply_count = (select count(reply_number) from reply where board_number = #{board_number})
	where b.board_number = #{board_number}
</update>

 

2. BoardDAO 추가

 

// BoardDAO.java

public void updateReplyCount(int board_number) throws Exception;

 

// BoardDAOImpl.java

private static String UPDATEREPLYCOUNT = NS + ".updateReplyCount";

@Override
public void updateReplyCount(int board_number) throws Exception {
	session.update(UPDATEREPLYCOUNT, board_number);
}

 

 

3. BoardService 추가

 

// BoardService.java

public void updateReplyCount(int board_number) throws Exception;

 

// BoardServiceImpl.java

@Override
public void updateReplyCount(int board_number) throws Exception {
	boardDAO.updateReplyCount(board_number);
}

 

 

4. BoardController.java 추가

 

저희는 사용자가 게시물 상세보기에서 댓글을 달기 때문에

댓글과 동시에 업데이트 쿼리로 board 테이블에 있는 reply_count에 값을 업데이트 시켜줄 것이기 때문에

 

readReply 메서드에 다음코드를 추가하겠습니다.

 

@RequestMapping(value = "/readView", method = RequestMethod.GET)
public String readReply(BoardVO board, @RequestParam("board_number") Integer board_number, @ModelAttribute("cri") Criteria cri, Model model) throws Exception {
	logger.info("read");
		
	service.viewCount(board_number);
    
	service.updateReplyCount(board_number);   // 게시물에 들어가면 댓글 수 업데이트
    
	model.addAttribute("BoardVO", service.read(board.getBoard_number()));
	model.addAttribute("cri", cri);
		
	List<ReplyVO> replyList = replyService.readReply(board.getBoard_number());
	model.addAttribute("replyList", replyList);
		
	return "board/readView";
}

 

 

5. listPage.jsp 작성

 

<!-- listPage.jsp -->

<div class="container">
		<table class="table table-bordered">
		
			<tr> <!-- 한줄 -->
				<th>번호</th> <!-- 첫번째 칸 -->
				<th>제목</th> <!-- 두번째 칸 -->
				<th>작성자</th> <!-- 세번째 칸 -->
				<th>작성일자</th> <!-- 네번째 칸 -->
				<th>조회수</th>
			</tr>
			
			<c:forEach items="${list}" var="boardVO">
				<tr>
					<td>${boardVO.board_number}</td>
					<td><a href="/board/readView${pageMaker.makeQuery(pageMaker.cri.page)}&board_number=${boardVO.board_number}">${boardVO.title }
						<c:if test="${boardVO.reply_count ne 0}">
							<small><b>[&nbsp;<c:out value="${boardVO.reply_count}"/>&nbsp;]</b></small>
						</c:if>
					</a></td>
					<td>${boardVO.name}</td>
					<td><fmt:formatDate pattern="YYYY-MM-dd" value="${boardVO.create_date}"/></td>
					<td>${boardVO.view_count}</td>
				</tr>
			</c:forEach>
		</table>
	</div>

 

보시다시피 제목을 담당하고 있는 <td> 태그를 보시면

 

<c:if test="${boardVO.reply_count ne 0}">
	<small><b>[&nbsp;<c:out value="${boardVO.reply_count}"/>&nbsp;]</b></small>
</c:if>

 

"${boardVO.reply_count ne 0}" 이 보이실텐데요 

이 ne는 != (같지 않으면) 이라는 의미를 가지고 있기에

댓글의 개수가 0이 아니라면 제목 옆에 댓글의 개수를 적어주겠다!!

라는 의미라고 생각하시면 될것 같습니다.

 

확인해보겠습니다.

 

 

현재 887 게시물에는 댓글이 달려 있지 않습니다.

댓글을 달아 볼까요?

 

 

 

 

 

 

 

정상적으로 댓글의 갯수를 출력합니다!!!

+ Recent posts