계층형 댓글을 구현해 보았다.
직접 구현했다기보다는 동빈 나 님이 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 |
실행 결과>>
대댓글은 다음에..
'게시판' 카테고리의 다른 글
[SPRING BOOT_JPA] 부트스트랩으로 페이징구현 (1) | 2021.03.30 |
---|---|
[SPRING BOOT_JPA] DB를 통해 파일 업로드 및 다운로드 하기 (0) | 2021.02.06 |
[SPRING BOOT_JPA] Multipartfile로 이미지 저장하기 (0) | 2021.02.05 |