[JPA Query Language]
-약자는 JPQL로 JPA에서 사용가능한 쿼리 언어
-엔티티 객체를 대상으로 동작하는 쿼리이기에 엔티티의 이름과 필드의 이름을 그대로 사용하여 쿼리문을 작성
[쿼리 메서드]
-JpaRepository 인터페이스 상속을 통해 가져오는 경우 구현되어 있는 메소드로 지정할 수 있는 범위에는 한계가 있기 때문에 별도의 메서드를 정의해서 사용하게 된다. 이렇게 개발자의 입맛에 맞게 여러 개의 키워드를 조합하여 만들어내는 메서드를 쿼리 메서드라고 한다.
-동작을 결정하는 주제와 검색 및 정렬 조건을 지정하는 서술어로 구분한다
ex)
리턴타입 {주제 + 서술어}(대상 필드)
List findByClub(String club)
참고) 쿼리 메소드 (Query Method) (velog.io)
[주제 키워드]
- find(All)By
-조회 - existBy
-존재여부 판별 - countBy
-해당 레코드 수 반환 - deleteBy
-삭제 - First<Number>/Top<Number>
-상위 몇 개로 결과값의 개수를 제한 - Distinct
-중복제거
[조건자 키워드]
- Is / Equals
-대게 생략 - IsNot
-값이 불일치하는 것들로 - IsNull / IsNotNull
-값이 Null / 값이 Null이 아닌지 - IsTrue / IsFalse
-필드가 boolean으로 지정된 칼럼값이 True인지 False인지 - And / Or
-여러 조건을 묶어서 사용 - IsGreaterThan(Equal) / IsLessThan(Equal) / IsBetween
-정수형이나 LocalDateTime 타입에 대한 비교 연산 수행 - IsStartingWith / IsEndingWith / IsContaining
-문자열의 앞부분, 끝부분, 중간에 해당 키워드를 포함하는 경우 - OrderBy
-List findByClubOrderByGenerationAsc(String club)와 같은 형식으로 Asc, Desc를 뒤에 붙여 활용
-정렬 조건을 너무 많이 나열하는 것은 보기에 좋지 않으므로 정렬 객체(Sort)를 매개변수에 넣어 간결하게 처리하는 방법도 있음
//리파지토리 인터페이스 내
List<Member> findByClub(String club, Sort sort);
//서비스 클래스 내
List<Member> members = memberRepository.findByName("DCOM",Sort.by(Order.asc("generation"));
//두개 이상의 정렬 조건인 경우 Sort.by(Order.by(~) , ...);
[페이징]
-레코드를 갯수로 나눠 페이지를 구분
//리파지토리 인터페이스 내
Page<Member> findByClub(String club, Pageable pageable);
//반환값은 Page 타입로 두고, 입력 파라미터로 Pageable 타입으로 두기
//서비스 클래스 내
Page<Member> memberPage = memberRepository.findByClub("DCOM",PageReqeust.of(0,4));
//0번째 페이지에서 데이터 4개만큼
-Pageable의 구현체가 PageRequest 객체이고 of 메서드를 통해 객체를 생성해주어야 함
[@Query]
-사용자가 직접 JPQL을 작성하여 메서드를 생성할 수 있다.
@Query("SELECT m FROM MEMBER AS m WHERE m.club = :club")
List<Member> findByClub(@Param("club") String club);
-이때 위의 쿼리문 안의 :club과 입력받는 club값을 매핑하기 위하여 @Param("club")을 통해 바인딩해준다
[연관관계]
JPA를 사용하는 객체지향 모델링에서는 엔티티 간 참조 방향을 설정할 수 있다.
- 단방향 : 두 엔티티 관계에서 한 쪽의 엔티티만 참조하는 형식
- 양방향 : 두 엔티티 관계에서 각 엔티티가 서로의 엔티티를 참조하는 형식
- 1:1
- @OneToOne 어노테이션을 사용해 매핑 - 1:N
- @OneToMany 어노테이션을 사용해 매핑 - N:1
- @ManyToOne 어노테이션을 사용해 매핑 - N:M
-@ManyToMany 어노테이션이 있지만 교차 엔티티(중간자)를 따로 두어 @OneToMany와 @ManyToOne관계로 해소하는 것이 바람직
-좋아요 기능을 중간자로 활용하는 예시
회원은 여러개의 게시글의 좋아요를 누를 수 있기에 좋아요를 누른 여러개의 게시글 정보 를 가질 수 있으며, 한 게시글은 여러 좋아요를 누른 회원의 정보를 가질 수 있음
[영속성 전이]
-특정 엔티티의 영속성 상태를 변경할 떄, 그 엔티티와 연관된 엔티티의 영속성에도 영향을 미쳐 영속성의 상태를 변경하는 것을 의미
-OneToOne, ManyToOne, OneToMany 어노테이션의 필드에 cascade라는 요소를 통해 영속성 전이를 설정
- ALL : 모든 영속 상태 변경에 대해 영속성 전이를 사용 -> 무분별한 사용 x
- PERSIST : 영속화 할 때, 연관된 엔티티도 함께 영속화
- REMOVE : 엔티티를 제거할 때, 연관된 엔티티도 함께 제거
- DETACH : 엔티티를 영속성 컨텍스트에서 제외하면 연관된 엔티티도 제외
[고아 객체]
-부모 엔티티와 연관관계가 끊어진 엔티티(연관 관계를 나타내는 필드가 null)
-orpahnRemoval 필드를 true로 설정하면 고아 객체를 자동으로 인식하여 삭제한다
하지만 다른 엔티티와도 연관관계를 맺고 있을 경우 오류가 발생하기 때문에 수동으로 확인 후 삭제하는 것이 권장됨
'Backend > 스프링' 카테고리의 다른 글
| 스프링부트 스터디 5주차 - 유효성 검사 및 실습 (0) | 2023.08.30 |
|---|---|
| 스프링부트 스터디 3주차 - 데이터베이스 연동 (0) | 2023.08.22 |
| 스프링부트 스터디 2주차 - 프로젝트 생성 및 API 구현 (0) | 2023.08.02 |