-
[Spring] QueryDsl projectionFramework/Spring 2022. 3. 1. 21:18
이번 시간에는 QueryDsl을 사용하여 projection하는 방법을 알아보도록 한다.
실무에서 보통 전체 필드에 대한 조회보다는 특정한 필드만 select 하고 싶을 때가 많다.
그럴 때 JPA보다는 QueryDsl을 쓰는게 좋은 그 예시를 보도록 하자.
EntityManager em; List<MemberDto> result = em.createQuery("select new study.developia.querydsl.dto.MemberDto(m.username, m.age)" + " from Member m", MemberDto.class).getResultList();
우선 순수 JPA로 작성하였을 때는 다음과 같다. 쿼리 부분을 보면 select절에 dto 패키지명을 전부 다 적어야하는 것을 알 수 있다.
물론 IDE를 사용하는 경우 힌트를 통해서 적기 쉽긴 하지만 패키지명이 굉장히 길어져서 읽기가 힘든 부분은 케어할수 없다.
이런 부분을 querydsl의 3가지 방법으로 해결할 수 있다.
// 1. 프로퍼티 접근 List<MemberDto> result = queryFactory .select(Projections.bean( MemberDto.class, member.username, member.age)) .from(member) .fetch();
querydsl로 작성하는 경우 굉장히 깔끔하고 가독성이 좋아지는 것을 알 수 있다.
Projections.bean은 프로퍼티를 통하여 projection하는 방법이다. MemberDto에 setter부분이 있어야 한다.
// 2. 필드 접근 List<MemberDto> result = queryFactory .select(Projections.fields( MemberDto.class, member.username, member.age)) .from(member) .fetch();
두번째는 필드로 접근하는 방법이다. 필드로 접근하는 방법을 사용하려면 dto에 기본 생성자가 있어야 한다.
lombok을 사용하는 경우 @NoArgsConstructor를 사용하거나 직접 생성해주어야 한다.
// 3. 생성자 접근 List<MemberDto> result = queryFactory .select(Projections.constructor( MemberDto.class, member.username, member.age)) .from(member) .fetch();
세번째는 생성자로 접근하는 방법이다. 사실 위 3가지 방법 모두 Projections class를 통해서 사용하는 방법이라 한가지 방법만 알아두면 익히기 쉽다. 생성자로 접근하는 방법은 필드 접근과는 다르게 select하는 필드 값을 넣어주는 생성자가 있어야 한다.
실무에서 패키지명을 사용하여 적는 것도 나쁘진 않지만 개발은 혼자 개발하는 것이 아닌 팀 단위 개발이기에, 다른 팀원을 생각하여 가급적이면 querydsl로 가독성 있도록 코드를 작성하도록 하자. 또한 당장 쓰지 않더라도 쿼리가 복잡해질수록 더욱 더 가독성이 좋은 것이 좋으니 꼭 알아두도록 할 것!
'Framework > Spring' 카테고리의 다른 글
[Spring] Querydsl 동적 쿼리 (0) 2022.03.04 [Spring] QueryDsl projection(2) (0) 2022.03.02 [SpringBoot] Jackson Annotation (0) 2020.08.17 [SpringBoot] 예외처리 (0) 2020.06.22 [Spring Boot] Banner 배너 변경하기 (0) 2020.05.26