개인 공부/BackEnd Study

[ Spring Boot ] 맨날 까먹는 나를 위한 복습 - 14 -

킴도비 2024. 3. 29. 15:03

14.1 댓글 기능의 개요

  • 게시판을 보면 하나의 게시글에 수많은 댓글이 달림 이러한 관계를 one-to-many, 즉 일대다(1 : n) 관계라고 함
  • 댓글 입장에서 보면 여러 댓글이 하나의 게시글에 달리므로 many-to-one, 즉 다대일(n : 1) 관계임

 

  • id와 같이 자신을 대표하는 속성을 대표키(PK, Primary KEy)라고 함. 대표키는 동일 테이블 내에서 중복된 값이 없어야 함.
  • comment 테이블에는 연관 대상을 가리키는 article_id가 하나 더 있음. article_id와 같이 연관 대상을 가리키는 속성을 외래키(FK, Foreign Key)라고 함

 

  • 엔티티 : DB 데이터를 담는 자바 객체로, 엔티티를 기반으로 테이블 생성
  • 리파지터리 : 엔티티를 관리하는 인터페이스로, 데이터 CRUD 등의 기능 제공

 

  • JpaRepository는 ListCrudRepository와 ListPagingAndSortingRepository를 상속받은 인터페이스로, CRUD 기능뿐만  아니라 엔티티를 페이지 단위로 조회 및 정렬하는 기능과 JPA에 특화된 여러 기능 등을 제공
  • Repository : 최상위 리파지터리 인터페이스
  • CrudRepository 및 ListCrudRepository : 엔티티의 CRUD 기능 제공
  • PagingAndSortingRepository 및 ListPagingAndSortingRepository : 엔티티의 페이징 및 정렬 기능 제공
  • JpaRepository : 엔티티의 CRUD 기능과 페이징 및 정렬 기능뿐만 아니라 JPA에 특화된 기능을 추가로 제공

 

14.2 댓글 엔티티 만들기

  • @ManyToOne어노테이션을 붙이면 해당 필드가 가리키는 엔티티를 다대일 관계로 설정함
  • 다대일 관계를 설정했다면 외래키도 매핑(연결)해 줘야 함. 외래키 매핑은 @JoinColumn 어노테이션을 사용하며 name 속성으로 매핑할 외래키 이름을 지정함.
@JoinColumn(name="외래키_이름")

 

 

14.3 댓글 리파지터리 만들기

  • JpaRepository가 ListCrudRepository와 ListPagingAndSortingRepository 인터페이스를 상속 받아 만들어진 것을 알 수 있음.

JpaRepository 설명

 

  • 네이티브 쿼리 메서드란?
    • 직접 작성한 SQL 쿼리를 리파지터리 메서드로 실행할 수 있게 해줌
    • 네이티브 쿼리 메서드를 만드는 2가지 방법 @Query 어노테이션 이용 또는 orm.xml 파일을 이용
@Query(value = "쿼리", nativeQuery = true)

 

  • @Query 어노테이션은 SQL과 유사한 JPQL(Java Presistence Query Language)이라는 객체 지향 쿼리 언어를 통해 복잡한 쿼리 처리를 지원
  • nativeQuery 속성을 true로 하면 기존 SQL 문을 그대로 사용 가능
  • 이 속성을 true로 설정해 JPQL 대신 SQL 문을 사용
  • SQL 문의 WHERE 절에 조건을 쓸 때 매개변수 앞에는 꼭 콜론(:)을 붙여줘야 메서드에서 넘긴 매개변수와 매칭 됨.

 

  • 메서드에서 수행할 쿼리를 XML에 작성한 것을 네이티브 쿼리 XML이라고 함. 
  • 네이티브 쿼리 XML의 기본 경로와 파일 이름은 META-INF > orm.xml임. 이 경로로 파일을 만들면 XML이 자동으로 인식 됨

 

  • <entity-mappings> 태그 안에 <named-native-query>와 <query> 태그를 이용해 쿼리를 입력
  • <named-native-query> 태그의 name 속성에는 쿼리를 수행하는 대상 엔티티.메서드 이름을 적음
    • 즉, CommentRepository의 findByNickname 메서드가 아래 쿼리를 수행하겠다는 뜻
    • result-class 속성에는 쿼리가 반환하는 타입의 정체 패키지 경로를 작성
  • <query> 태그에는 실제 수행할 쿼리를 작성.
    • <![CDATA[ ... ]]> 구문 안에 작성. 해당 구문은 Character DATA, 즉 파싱(구문 분석)되지 않은 문자 데이터를 쓸 때 사용. 
    • 이 구문을 사용해야 SQL 문의 값의 대소 비교 연산(>, <, 등)에 문제가 생기지 않음

 

  • @DisplayName은 테스트 이름을 붙일 때 사용. 
    • 기본적으로 테스트 이름은 메서드 이름에 따라 감.
    • 메서드 이름은 그대로 둔 채 테스트 이름을 바꾸고 싶을 때 이 어노테이션을 사용
@DisplayName("테스트_결과에_보여_줄_이름")