728x90
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
인터페이스 기반 Closed Projections
엔티티 대신에 DTO를 편리하게 조회할 때 사용


- 조회할 엔티티의 필드를 getter 형식으로 지정하면 해당 필드만 선택해서 조회(Projection)
- 메서드 이름은 자유, 반환 타입으로 인지
인터페이스 기반 Open Proejctions
스프링의 SPEL 문법 지원
public interface UsernameOnly {
@Value("#{target.username + ' ' + target.age + ' ' + target.team.name}")
String getUsername();
}
- 단! 이렇게 SpEL문법을 사용하면, DB에서 엔티티 필드를 다 조회해온 다음에 계산한다!
- 따라서 JPQL SELECT 절 최적화가 안된다.
클래스 기반 Projection

- 생성자의 파라미터 이름으로 매칭한다.
동적 Projections


- GenericType 을 주어 동적 Projection으로 사용이 가능하다.
중첩 구조



- 중첩된 데이터는 모두 다 가지고 온다(최적화 x)
- 프로젝션 대상이 root 엔티티면, JPQL SELECT 절 최적화 가능
- 프로젝션 대상이 ROOT가 아니면
- LEFT OUTER JOIN 처리
- 모든 필드를 SELECT 해서 엔티티로 조회한 다음에 계산
정리
- 프로젝션 대상이 root 엔티티면 유용하다.
- 프로젝션 대상이 root 엔티티를 넘어가면 JPQL SELECT 최적화가 안된다!
- 실무의 복잡한 쿼리를 해결하기에는 한계가 있다.
실무에서는 단순할 때만 사용하고, 조금만 복잡해지면 QueryDSL을 사용하자
728x90
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch01. 프로젝트 환경 설정 - 예제 도메인 모델과 동작확인 (0) | 2022.04.26 |
|---|---|
| Ch06. 나머지 기능들 - 네이티브 쿼리 (0) | 2021.12.29 |
| Ch06. 나머지 기능들 - Query By Example (0) | 2021.12.28 |
| Ch06. 나머지 기능들 - Specifications (명세) (0) | 2021.12.28 |
| Ch05. 스프링 데이터 JPA 분석 - 새로운 엔티티를 구별하는 방법 (0) | 2021.12.28 |