(QueryDsl) DTO Projection

bagt13·2022년 9월 6일
0

JPA

목록 보기
4/13
post-thumbnail




projection이란

select 절에 대상을 지정하여 원하는 값만 뽑아오는 것을 의미한다.




projection 대상이 하나인 경우, 간단하게 작성할 수 있다.



projection 대상이 둘 이상인 경우, 타입을 명확하게 지정할 수 없으므로 튜플(Tuple)이나 DTO로 조회해야 한다.




튜플(Tuple) 사용 시 주의할 점


튜플은 querydsl 에서 제공하는 타입이기 때문에 서비스 또는 API계층에서 사용하게 되면 의존성이 꼬여버리는 문제가 발생한다.

-> 튜플은 Repository 에서만 사용하는 것이 좋고, 서비스 계층으로 반환할 때에는 DTO 로 변환 후 반환하는 것이 좋다.




DTO projection


기존의 JPQL로 DTO projection을 사용하려면 package 경로를 적어줘야 하는 번거로움과 생성자 방식만 사용할 수 있다는 제약이 있었다.



queryDsl을 사용하면 훨씬 편하고 안정적으로 DTO projection이 가능하다.


queryDsl은 아래의 총 4가지 방식으로 DTO projection을 지원한다.

  • 프로퍼티 접근
  • 필드 접근
  • 생성자 사용
  • @QueryProjection




프로퍼티 접근

  • 프로퍼티 접근 방식은 getter/setter를 이용해 필드에 접근하여 데이터를 주입해준다.




필드 접근

  • 필드 접근 방식은 프로퍼티 접근 방식과 유사하지만, getter/setter와 상관 없이 그냥 필드에 데이터를 주입해준다.
  • 필드 접근 방식을 사용할 때는 DTO의 필드 이름과 query에 작성된 필드의 이름이 같아야 하며, 다를 경우 alias를 사용해서 맞춰주어야 한다.




생성자 방식

  • 생성자를 통해 데이터를 주입받는다.




@QueryProjection


사용 방법

  • 먼저, 주입받을 DTO의 생성자에 @QueryProjection 애노테이션을 작성하면, 해당 DTO의 QFile이 생성된다.
  • 그 다음, 해당 Q타입을 select절에 작성하면 된다.



QueryProjection의 장점

  • 다른 방식들과 달리, 이 방법은 컴파일시점에 필드 타입체크 등이 가능하기 때문에 안정적으로 코드를 작성할 수 있다.

단점

  • DTO의 경우 서비스, API 계층 등 여러 곳에서 사용될 수 있는데, DTO가 queryDsl에 의존하게 되면서 의존관계가 꼬일 수 있기 때문에, 상황에 따라 알맞게 사용해야 한다.






Entity 조회 vs DTO 조회


DTO projection을 사용하면 원하는 필드만 뽑아올 수 있고, 엔티티를 DTO로 변환하는 과정 없이 바로 반환할 수 있기 때문에 편리한 점이 있다.


하지만, 엔티티로 직접 조회할 때에는 영속성 컨텍스트의 관리를 받지만, DTO로 조회하게 되면 영속성 컨텍스트에서 관리되지 않는다.


따라서, 엔티티로 조회할 수 있는 경우 또는 영속성 컨텍스트 내에서 관리되어야 하는 경우에는 엔티티로 조회 하되, projection 또는 성능 최적화가 필요한 경우에는 DTO projection을 사용해 조회하면 된다.





자료 출처 : 김영한 님의 자바 ORM 표준 JPA 프로그래밍 기본

profile
주니어 백엔드 개발자입니다😄

0개의 댓글