쌓고 쌓다
[스프링 부트] 댓글 삭제 및 댓글 개수 - 10 본문
게시글에 달린 댓글 개수를 위한 필드와 컬럼을 수정한다.
1. Poster 필드 추가
@Entity
public class Poster {
@Column(name="comment_cnt")
private int commentCnt;
public int getCommentCnt() {
return commentCnt;
}
public void setCommentCnt(int commentCnt) {
this.commentCnt = commentCnt;
}
}
2. Poster 테이블 comment_cnt 컬럼 추가
ALTER TABLE poster ADD COLUMN comment_cnt int not null default 0;
CommentService
public class CommentService {
public Comment findComment(Long commentId) {
return commentRepository.findById(commentId).get();
}
public void deleteComment(Long commentId) {
commentRepository.deleteById(commentId);
}
}
댓글의 PK로 댓글 찾기, 삭제 메서드를 추가.
PosterService
public class PosterService {
public void incrementCommentCnt(Long id) {
Poster poster = posterRepository.findById(id).get();
int commentCnt = poster.getCommentCnt();
poster.setCommentCnt(commentCnt+1);
}
public void decreaseCommentCnt(Long id) {
Poster poster = posterRepository.findById(id).get();
int commentCnt = poster.getCommentCnt();
poster.setCommentCnt(commentCnt-1);
}
}
댓글의 작성과 삭제시에 해당 게시글의 댓글 수를 증감하는 메서드를 추가했다.
CommentController
@Controller
public class CommentController {
private final CommentService commentService;
private final PosterService posterService;
@Autowired
public CommentController(CommentService commentService, PosterService posterService) {
this.commentService = commentService;
this.posterService = posterService;
}
@PostMapping("/comment/write")
public String commentWrite(Comment comment) {
posterService.incrementCommentCnt(comment.getPno()); // 게시글의 댓글 수 증가
commentService.write(comment); // 댓글 저장
return "redirect:/poster/read?id=" + comment.getPno();
}
@PostMapping("/comment/delete")
public String commentDelete(Long id) {
Comment comment = commentService.findComment(id);
posterService.decreaseCommentCnt(comment.getPno()); // 게시글의 댓글 수 감소
commentService.deleteComment(id); // 댓글 삭제
return "redirect:/poster/read?id=" + comment.getPno();
}
}
댓글 작성시에 댓글의 pno(게시글 번호)를 통해 해당 게시글을 찾고
그 게시글의 댓글 수를 1 증가시킨다.
댓글 제거 시에도 동일하다.
posterView.html
<div>
<ul>
<li th:each="comment : ${comments}">
<span th:text="|${comment.writer} ${comment.content} ${#temporals.format(comment.regDate, 'yyyy.MM.dd HH:mm')}|"> </span>
<form th:action="@{/comment/delete}" method="post">
<input type="hidden" name="id" th:value="${comment.id}">
<button type="submit">삭제</button>
</form>
</li>
</ul>
</div>
앞전에 포스팅한 댓글 작성에 쓰인 댓글 출력 부분이다.
댓글 삭제를 위해 아래의 코드가 추가되었다.
<form th:action="@{/comment/delete}" method="post">
<input type="hidden" name="id" th:value="${comment.id}">
<button type="submit">삭제</button>
</form>
버튼으로 POST 요청을 보내는 방법이다.
input 태그로 해당 댓글의 PK를 POST 요청으로 넘겨 댓글 삭제가 이뤄진다.
posterList.html
<a th:text="|${poster.title} [${poster.commentCnt}]|" th:href="@{/poster/read(id=${poster.id})}"></a>
게시글 목록 출력 시 게시글 제목에 총 댓글 개수를 추가했다.
동작 결과
'프로그래밍 > spring' 카테고리의 다른 글
의존관계 주입 방법 4가지 (0) | 2023.07.14 |
---|---|
컴포넌트 스캔과 의존관계 주입 (0) | 2023.07.13 |
@Configuration, 싱글톤 방식의 주의점 (1) | 2023.07.12 |
싱글톤 패턴, 싱글톤 컨테이너(스프링 컨테이너) (0) | 2023.07.10 |
[스프링 부트] 게시글 댓글 작성 - 9 (0) | 2023.07.10 |
Comments