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