[Spring Boot] Day14 - 댓글 엔티티와 리파지터리

Sarah·2025년 12월 14일

Spring Boot

목록 보기
13/17

오늘의 목표

게시글 REST API - CRUD 구현하는 법을 배웠으니 이제 각 게시글에 댓글을 달아보자! 먼저 댓글 엔티티와 리파지터리 만들기.

댓글 CRUD 구현 순서

  • 댓글 엔티티, 댓글 리파지터리 만들기 -> 댓글 테이블 구조와 게시글과의 관계 정의, DB에 댓글을 저장/조회할 수 있는 기반을 만듬.
  • (다음 챕터) 댓글 컨트롤러, 댓글 서비스 만들기 -> 댓글 CRUD 조회, 생성, 수정, 삭제 기능 구현

댓글 엔티티 만들기

  • entity 디렉터리 -> New -> Java Class 로 Comment 이름의 클래스를 생성.
@Entity
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Comment {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY) // DB가 자동으로 1씩 증가
    private Long id;
    
    @ManyToOne
    @JoinColumn(name="article_id", nullable = false) 
    private Article article;
    
    @Column
    private String nickname;
    
    @Column
    private String body;

}
  • 필드로 id, Article, nickname, body를 작성한다.
  • id 필드는 @Id @GeneratedValue 어노테이션 추가.
  • 이외 필드는 컬럼임을 선언하는 @Column 어노테이션 추가.
  • @JoinColumn(name="article_id") : Article 엔티티의 id를 외래키로 지정 (외래키 이름 : article_id)
  • @ManyToOne : Comment 엔티티와 이 필드가 가리키는 Article 엔티티를 다대일 관계로 설정
  • h2-console 접속해서 테이블이 만들어졌는지 확인해보기

  • 더미 데이터를 data.sql에 추가하고, 다시 h2-console에 접속해서 테이블에 데이터가 들어가 있는지 확인해보기


댓글 리파지터리 만들기

  • repository 디렉터리 -> New -> Java Class -> CommentRepository 이름의 새로운 인터페이스 생성
public interface CommentRepository extends JpaRepository<Comment, Long> {
    //특정 게시글의 모든 댓글 조회
    @Query(value="Select * From comment Where article_id = :articleId", nativeQuery = true)
    List<Comment> findByArticleId(Long articleId);
    //특정 닉네임의 모든 댓글 조회
    List<Comment> findByNickname(String nickname);
}
  • JpaRepository 인터페이스를 상속받아 만든다.
  • CrudRepository : 엔티티의 CRUD (생성, 조회, 수정, 삭제) 기능 제공
  • JpaRepository : CRUD 기능, 페이징 및 정렬 기능 + JPA에 특화된 기능을 추가로 제공

네이티브 쿼리 메서드 만들기

@Query 어노테이션 이용

@Query(value="Select * From comment Where article_id = :articleId", nativeQuery = true)
    List<Comment> findByArticleId(Long articleId);
  • ArticleId (특정 게시물)의 모든 댓글을 조회하는 메서드
  • @Query를 작성하고 value에 쿼리를 작성한다.
  • SQL문의 where절에 조건을 쓸 때 매개변수 앞에 꼭 콜론(:) 붙이기.
  • nativeQuery 속성은 true로 해야 기존 SQL 문을 그대로 사용할 수 있음.

@Query 를 따로 작성하지 않아도 JPA 메서드 이름으로 동일한 기능을 구현할 수 있다.
다만 학습 목적으로 SQL 구조를 이해하기 위해 @Query어노테이션을 붙여 네이티브 쿼리를 사용했다.


댓글 리파지터리에서 메서드를 따로 생성하는 이유?

  • 게시글의 전체 게시글 조회 / 1개 게시글 조회 / 게시글 생성 / 수정 / 삭제 기능은 상속 받은 JpaRepository의 기본 메서드인 findAll() findById() save() delete() 로 충분히 가능. -> 별도의 "조건 조회 메서드"가 필요하지 않았기 때문.

  • 반면 댓글은? 특정 게시글의 댓글 조회, 특정 사용자의 댓글 조회 -> 즉, "조건 조회"가 필요!
  • 따라서 nickname, articleId 등을 기준으로 조회하는 커스텀 메서드 (findByArticleId findByNickname)CommentRepository에 추가로 정의한다.
profile
헤맨 만큼 내 땅

0개의 댓글