쌓고 쌓다

[스프링 부트] 댓글 삭제 및 댓글 개수 - 10 본문

프로그래밍/spring

[스프링 부트] 댓글 삭제 및 댓글 개수 - 10

승민아 2023. 7. 13. 11:40

게시글에 달린 댓글 개수를 위한 필드와 컬럼을 수정한다.

 

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>

게시글 목록 출력 시 게시글 제목에 총 댓글 개수를 추가했다.

 

 

동작 결과

 

Comments