[Spring Boot] 44. 스프링부트 블로그 v2 (JPA) (14) 댓글 목록 1

김주희's avatar
Apr 08, 2025
[Spring Boot] 44. 스프링부트 블로그 v2 (JPA) (14) 댓글 목록 1

1. tb 만들기

게시글 : 댓글 = 1 : N 댓글 = 명사 = tb 1유저 n댓글 => 여러개의 행 댓글 1개 입장에서는 유저 1명이 만듦 => 하나의 행
notion image
 
어떤 유저가 어떤 게시글에 댓글을 남겼는지 알 수 있음 → 여러개 남길 수 o ⇒ unique(x)
notion image
 
package shop.mtcoding.blog.board.reply; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; import shop.mtcoding.blog.board.Board; import shop.mtcoding.blog.user.User; import java.sql.Timestamp; @NoArgsConstructor @Getter @Table(name = "reply_tb") @Entity public class Reply { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String content; // 댓글 내용 @ManyToOne(fetch = FetchType.LAZY) private User user; @ManyToOne(fetch = FetchType.LAZY) private Board board; @CreationTimestamp private Timestamp createdAt; }
 
 

2. 더미데이터

  1. 게시글 1번과 댓글 조회하면 댓글이 없으므로 outer join으로 조회해야 한다.
  1. 게시글은 user가 없는 게시글이 없기 때문에 inner로 join 가능하다.
notion image
 

3. 화면에 뿌리기

1.

notion image

2. ReplyRepository

public class ReplyRepository { private final EntityManager em; public List<Reply> findAllByBoardId(int boardId) { Query query = em.createQuery("select r from Reply r join fetch r.user where r.board.id = :boardId", Reply.class); // inner join query.setParameter("boardId", boardId); List<Reply> replies = query.getResultList(); return replies; } }
 

3. BoardService

notion image
 

4. BoardResponse.DetailDTO

notion image
 

4. 문제점

이와 같은 방법으로 하게 될 경우 댓글을 삭제 아이콘이 해당 댓글 작성자에게만 노출되어야 하는데 이를 위해 isReplyOwner라는 변수가 필요해지고 Reply List 내부의 reply 마다 isReplyOwner가 있어야 되므로 ReplyDTO가 필요해진다.
→ 쓰레기통은 4/10에…
Share article

jay0628