게시글 REST API - CRUD 구현하는 법을 배웠으니 이제 각 게시글에 댓글을 달아보자! 먼저 댓글 엔티티와 리파지터리 만들기.
@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 @GeneratedValue 어노테이션 추가.@Column 어노테이션 추가.@JoinColumn(name="article_id") : Article 엔티티의 id를 외래키로 지정 (외래키 이름 : article_id)@ManyToOne : Comment 엔티티와 이 필드가 가리키는 Article 엔티티를 다대일 관계로 설정h2-console 접속해서 테이블이 만들어졌는지 확인해보기

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


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);
}
- CrudRepository : 엔티티의 CRUD (생성, 조회, 수정, 삭제) 기능 제공
- JpaRepository : CRUD 기능, 페이징 및 정렬 기능 + JPA에 특화된 기능을 추가로 제공
@Query 어노테이션 이용@Query(value="Select * From comment Where article_id = :articleId", nativeQuery = true)
List<Comment> findByArticleId(Long articleId);
@Query를 작성하고 value에 쿼리를 작성한다. nativeQuery 속성은 true로 해야 기존 SQL 문을 그대로 사용할 수 있음.
@Query를 따로 작성하지 않아도 JPA 메서드 이름으로 동일한 기능을 구현할 수 있다.
다만 학습 목적으로 SQL 구조를 이해하기 위해@Query어노테이션을 붙여 네이티브 쿼리를 사용했다.
댓글 리파지터리에서 메서드를 따로 생성하는 이유?
- 게시글의 전체 게시글 조회 / 1개 게시글 조회 / 게시글 생성 / 수정 / 삭제 기능은 상속 받은 JpaRepository의 기본 메서드인
findAll()findById()save()delete()로 충분히 가능. -> 별도의 "조건 조회 메서드"가 필요하지 않았기 때문.
- 반면 댓글은? 특정 게시글의 댓글 조회, 특정 사용자의 댓글 조회 -> 즉, "조건 조회"가 필요!
- 따라서 nickname, articleId 등을 기준으로 조회하는 커스텀 메서드 (
findByArticleIdfindByNickname)를 CommentRepository에 추가로 정의한다.