select 절에 대상을 지정하여 원하는 값만 뽑아오는 것을 의미한다.
projection 대상이 하나인 경우, 간단하게 작성할 수 있다.
projection 대상이 둘 이상인 경우, 타입을 명확하게 지정할 수 없으므로 튜플(Tuple)
이나 DTO
로 조회해야 한다.
튜플은 querydsl 에서 제공하는 타입이기 때문에 서비스 또는 API계층에서 사용하게 되면
의존성
이 꼬여버리는 문제가 발생한다.
-> 튜플은 Repository 에서만 사용
하는 것이 좋고, 서비스 계층으로 반환할 때에는 DTO 로 변환 후 반환하는 것이 좋다.
기존의 JPQL
로 DTO projection을 사용하려면 package 경로를 적어줘야 하는 번거로움과 생성자 방식만 사용할 수 있다는 제약이 있었다.
queryDsl을 사용하면 훨씬 편하고 안정적으로 DTO projection이 가능하다.
queryDsl은 아래의 총 4가지 방식으로 DTO projection을 지원한다.
프로퍼티 접근
필드 접근
생성자 사용
@QueryProjection
프로퍼티 접근 방식은
getter/setter
를 이용해 필드에 접근하여 데이터를 주입해준다.
- 프로퍼티 접근 방식과 유사하지만, getter/setter와 상관 없이 그냥 필드에 데이터를 주입해준다.
- 필드 접근 방식을 사용할 때는 DTO의 필드 이름과 query에 작성된 필드의 이름이 같아야 하며, 다를 경우 alias를 사용해서 맞춰주어야 한다.
생성자를 통해 데이터를 주입받는다.
사용 방법
- 먼저, 주입받을 DTO의 생성자에
@QueryProjection
애노테이션을 작성하면, 해당 DTO의 QFile이 생성된다.- 그 다음, 해당 Q타입을 select절에 작성하면 된다.
QueryProjection의 장점
QueryProjection의 단점
DTO projection을 사용하면 원하는 필드만 뽑아올 수 있고, 엔티티를 DTO로 변환하는 과정 없이 바로 반환할 수 있기 때문에 편리한 점이 있다.
하지만,
엔티티로 직접 조회
할 때에는 영속성 컨텍스트의 관리를 받지만,DTO로 조회
하게 되면 영속성 컨텍스트에서 관리되지 않는다.
따라서 엔티티로 조회할 수 있는 경우 또는 영속성 컨텍스트 내에서 관리되어야 하는 경우에는 엔티티로 조회
하되, projection 또는 성능 최적화가 필요한 경우에는 DTO projection
을 사용해 조회하면 된다.
자료 출처 : 김영한 님의 자바 ORM 표준 JPA 프로그래밍 기본