[실전! 스프링 데이터 JPA] 2. 쿼리 메소드 기능

김수현·2022년 9월 27일
0

Spring Data JpA

목록 보기
2/5
post-thumbnail

해당 카테고리는 김영한님의 인프런 강의 '실전! 스프링 데이터 JPA'를 듣고 내용을 정리하기 위한 것으로 자세한 설명은 해당 강의를 통해 확인할 수 있습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1. 메소드 이름으로 쿼리 생성

-메소드 이름을 분석해서 JPQL 쿼리 생성
-이름과 나이를 기준으로 회원을 조회하려면?

-스프링 데이터 JPA 메소드 이름을 분석해서 JPQL을 생성하고 실행한다.
-스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
(1) 조회: find ... by, read ... by, query ... by, get... by
(2) COUNT: count ... by - 반환타입 long
(3) EXIST: exists ... by - 반환타입 boolean
(4) 삭제: delete ... by, remove ... by - 반환타입 long
(5) DISTINCT: findDistinct, findMemberDistinctBy
(6) LIMIT: findFirst3, findFirst, findTop, findTop3
참고: 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메소드 이름도 꼭 함께 변경해야함.

2. @Query, 리포지토리 메소드에 쿼리 정의하기

-메소드에 JPQL 쿼리 작성

-@org.springframework.data.jpa.repository.Query 어노테이션 사용
-JPA Named 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있음!
참고: 실무에서는 메소드 이름으로 쿼리 생성 기능은 파라미터가 증가하면 메소드 이름이 매우 지저분해진다. 따라서 @Query기능을 자주 사용하게 된다.


3. @Query, 값, DTO 조회하기

-값 조회

-DTO로 직접 조회

-주의! DTO로 직접 조회하려면 JPA의 new명령어를 사용해야 한다. 그리고 다음과 같이 생성자가 맞는 DTO가 필요하다.(JPA와 사용방식이 동일하다.)

4. 파라미터 바인딩

-위치 기반 -> 사용 금지!
-이름 기반

참고: 코드 가독성과 유지보수를 위해 이름 기반 파라미터 바인딩을 사용!!

5. 반환 타입

-스프링 데이터 JPA는 유연한 반환 타입 지원

-조회 결과가 많거나 없으면?
(1) 컬렉션:
결과 없음: 빈 컬렉션 반환

(2)단건 조회:
결과 없음: null 반환
결과가 2건 이상: javax.persistence.NonUniqueResultException 예외 발생

참고: 단건으로 지정한 메소드를 호출하면 스프링 데이터 JPA는 내부에서 JPQL의 Query.getSingleResult()메소드를 호출한다. 이 메소드를 호출했을 때 조회 결과가 없으면 javax.persistence.NoResultException예외가 발생하는데 개발자 입장에서 다루기가 상당히 불편하다. 스프링 데이터 JPA는 단건을 조회할 때 이 예외가 발생하면 예외를 무시하고 대신에 null을 반환한다.

6. 페이징과 정렬

-페이징과 정렬 파라미터
(1) org.springframework.data.domain.Sort: 정렬 기능
(2) org.springframework.data.domain.Pageable: 페이징 기능(내부에 Sort 포함)

-특별한 반환 타입
(1) org.springframework.data.domain.Page: 추가 count 쿼리 결과를 포함하는 페이징
(2) org.springframework.data.domain.Slice: 추가 count 쿼리 없이 다음 페이지만 확인 가능(내부적으로 limit + 1조회)
(3) List(자바 컬렉션): 추가 count 쿼리 없이 결과만 반환

주의: Page는 1부터 시작이 아니라 0부터 시작!

-페이지를 유지하면서 엔티티를 DTO로 변환하기

7. 벌크성 수정 쿼리

-벌크성 수정, 삭제 쿼리는 @Modyfying 어노테이션 사용
-사용 안할 시 에러
-벌크성 쿼리 실행하고 영속성 컨텍스트 초기화: @Modyfying(clearAutomatically = true)
-다시 조회할 경우 꼭 컨텍스트 초기화 하기.
참고: 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다.
-권장하는 방안
(1) 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행한다.
(2) 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화 한다.

8. @EntityGraph

-연관된 엔티티들을 SQL 한번에 조회하는 방법
-사실상 페치조인(FETCH JOIN)의 간편 버젼
업로드중..
-findAll 같이 기본적으로 제공하는 부분은 지연로딩으로 해놨으면 프록시로 땡겨질 것이다. 이것을 @Override 해서 @EntityGraph(attributePaths = {“필드명”}) 으로 페치 조인할 필드를 넣어주면 페치 조인해서 가져올 수 있다. @EntityGraph(attributePaths = {“필드명”}) 는 메서드 이름으로 쿼리, jPQL에서도 적용할 수 있다.
참고 Entitygraph는 left outer join 이고, 기본적인 fetch join은 inner join이다.

profile
안녕하세요 [22.06.19 개설]

0개의 댓글