반응형
결과
테이블
기존 테이블 → board & board_reply
테이블 수정
ALTER TABLE board ADD reply_cnt int default 0;
게시글에 댓글 수 추가
UPDATE board SET reply_cnt = (
SELECT COUNT(reply_id)
FROM board_reply
WHERE board_reply.board_id = board.id);
기존에 있던 게시글들의 댓글 수 초기화
DTO 수정 : Board.java
...
private int reply_cnt;
...
public int getReply_cnt() {
return reply_cnt;
}
public void setReply_cnt(int reply_cnt) {
this.reply_cnt = reply_cnt;
}
}
DAO 수정
▶BoardDao 인터페이스
package com.spring.boardapp.dao;
...
public interface BoardDao {
...
// 댓글 수 업데이트
public int updateReplyCnt(Map<String, Object> paramMap);
}
파라미터를 Map으로 넘기는 이유
게시글이 갖고 있는 댓글 수를 업데이트 하기 위해서는 두 가지 파라미터가 필요하다.
하나는 게시글의 번호(board_id)와 수정될 수(amount) 이다.
굳이 amount를 파라미터를 주지 않아도 되지만 메소드를 수를 줄이기 위해서 파라미터를 늘리는 방향을 선택했다.
▶BoardDaoImpl.java
...
@Override
public int updateReplyCnt(Map<String, Object> paramMap) {
return sqlSession.update("updateReplyCnt", paramMap);
}
}
▶ReplyDao 인터페이스
...
// 댓글 조회
Reply getReply(String reply_id);
...
▶ReplyDaoImpl
@Override
public Reply getReply(String reply_id) {
// TODO Auto-generated method stub
return sqlSession.selectOne("selectReply", reply_id);
}
댓글이 등록될 때는 Reply에 대한 정보를 알고 있어 게시글 번호를 가져올 수 있지만
댓글이 삭제될 때는 reply_id만 알고 있기 때문에 이를 통해 Reply(댓글)에 대한 객체를 가져오고 그 다음 게시글 번호를 가져와야 하기 때문에 게시글을 가져오는 기능을 추가하였다.
board.xml 수정
<update id="updateReplyCnt" parameterType="java.util.HashMap">
UPDATE board
SET reply_cnt = reply_cnt + #{amount}
WHERE id = #{id}
</update>
ReplyServiceImpl 수정
▶댓글이 등록될 때
@Override
public int insertReply(Reply reply) {
// TODO Auto-generated method stub
Map<String, Object> param = new HashMap<String, Object>();
param.put("id", reply.getBoard_id());
param.put("amount", "1");
boardDao.updateReplyCnt(param);
return replyDao.insertReply(reply);
}
▶댓글이 삭제될 때
@Override
public boolean deleteReply(String reply_id) {
// TODO Auto-generated method stub
Reply reply = replyDao.getReply(reply_id);
if(replyDao.deleteReply(reply_id)>0) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("id", reply.getBoard_id());
param.put("amount", "-1");
boardDao.updateReplyCnt(param);
return true;
}
else return false;
}
BoardDao와 ReplyDao와 같이 쓰이기 때문에 트랜잭션으로 처리하는 것이 더욱 좋다.
View
게시글 제목(boardList.title) 옆에 [게시글의 댓글수] 가 출력되도록 하였다.
<table border="1" width="930px">
<tr>
<th width="50px">No</th>
<th width="400px">제목</th>
<th width="80px">작성자</th>
<th width="80px">조회수</th>
<th width="160px">작성일</th>
<th width="160px">수정일</th>
</tr>
<c:forEach var="boardList" items="${boardList }">
<tr>
<td>${boardList.id }</td>
<td><a href="/board/detail/${boardList.id }?searchType=${pageMaker.searchType }&searchWord=${pageMaker.searchWord }&pageNum=${pageMaker.pageNum}&pageAmount=${pageMaker.pageAmount}">
${boardList.title }<b>[ <c:out value="${boardList.reply_cnt }" /> ]</b></a></td>
<td>${boardList.writer }</td>
<td>${boardList.views }</td>
<td>${boardList.regist_datetime }</td>
<td>${boardList.modify_datetime }</td>
</tr>
</c:forEach>
</table>
반응형
'ETC' 카테고리의 다른 글
Spring + Ajax 중복된 파일 이름 해결 (0) | 2022.09.25 |
---|---|
Spring + Ajax 파일 확장자, 크기 제한 (Ajax) (0) | 2022.09.25 |
Spring + Ajax 파일 업로드 (0) | 2022.09.25 |
[SpringMVC + MyBatis + Ajax] 게시판 댓글 추가/삭제/List (Ajax 이용) (0) | 2022.09.24 |
[SpringMVC + MyBatis + MySql] 게시판 CRUD + 페이징처리 + 검색조건 + 조회수 (0) | 2022.09.15 |