본문 바로가기

게시판

[SPRING BOOT_JPA] JPA계층형 댓글 구현해보기-1

계층형 댓글을 구현해 보았다.

직접 구현했다기보다는 동빈 나 님이 JSP로 계층형 댓글을 구현하는 영상을 올리셨는데 그것을 그대로 JPA로 따라 했다. 

www.youtube.com/watch?v=sF5LOyd_klk&list=PLRx0vPvlEmdAlUbX_TGDxaSxKCvfl2isa&index=27

 

 

나에게 계층형 댓글이 제일 어려웠던 부분은 JSP를 SPRING BOOT JPA로 바꾸는 것도 있었지만

댓글을 계층형으로 달았을 때 데이터베이스가 어떻게 바뀌는지 이해하는것이 어려웠다.

 

우선 실행 결과이다.

댓글은 Comments에서 작성하며 댓글의 댓글 이상(계층형 댓글 시작)은 새로운 창으로 이동 후 내용을 작성한다.

 

1. 댓글 작성 후 

2. 대댓글 이상을 작성 했을 때

3. 대댓글 이상 작성 후

 

Entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Entity
@Getter
@NoArgsConstructor
public class Comment extends BaseTime{
 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long id;
 
    private String content;
 
    private int commentCnt;
 
    private int commentGroup;
 
    @ColumnDefault("0")
    private int commentSequence;
 
    @ColumnDefault("0")
    private int level;
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Board board;
cs

 

-- 속성 --

 

content = 댓글 내용

commentCnt = 댓글 개수

commentGroup = 댓글을 달았을 때(대댓글 이상이 아닌 첫 댓글) 증가하는 값

(댓글을 달았을 때 Id가 자동으로 증가하는 것과 같이 commentGroup도 증가하도록 해야 한다.)

commentGroup은 대댓글 이상 달았을 때 증가하지 않으며, 대댓글 혹은 그 이상은 최상위 댓글의 commentGroup와 같은 값을 가진다. 또한 댓글을 정렬한다. 

commentSequence = 대댓글 이상을 작성했을 때 값이 증가하며, 이것으로 계층형 댓글을 정렬한다.

level = 계층형 댓글의 깊이를 나타낸다.

 

댓글 Controller

1
2
3
4
5
6
7
8
9
10
    // 댓글
    @PostMapping("/board/{boardId}/detail")
    public String createComment(@PathVariable Long boardId,
                                @ModelAttribute("form") CommentDto commentDto) {
 
        Board findBoard = boardService.findOne(boardId);
 
        commentService.save(findBoard, commentDto.getContent());
        return "redirect:/board/" + boardId + "/detail";
    }
cs

 

controller에서는 연관관계를 설정한 게시글(findBoard) 댓글 내용(getContent)을 save로 넘겨준다.

 

댓글 Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // 첫번째 댓글
    @Transactional
    public void save(Board board, String content){
        Integer commentGroup = commentRepository.findCommentGroup().orElse(0);
 
        Comment comment = new Comment(board, content);
        comment.changeGroup(commentGroup);
 
        commentRepository.save(comment);
 
 
    }
 
cs

 

commentGroup을 Id처럼 댓글이 생성될 때마다 1씩 증가시키기 위하여 commentRepository에서 commentGroup의 max를 찾은 후 없으면(null이면) 0을 반환하고 0 이상이 있다면 changeGroup을 통해서 1씩 증가시킨다.

 

댓글 Repository

1
2
3
    @Query("select max(c.commentGroup) from Comment c")
    Optional<Integer> findCommentGroup();
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
    // 댓글
    public Comment(Board board, String content) {
      this.board = board;
        this.content = content;
        this.setCreatedAt(LocalDateTime.now());
 
    }
 
    public void changeGroup(int commentGroup){
        this.commentGroup = commentGroup + 1;
    }
 
cs

 

실행 결과>>

 

대댓글은 다음에..