QueryDsl 에서 Projection 종류와 방법
QueryDsl에서 Projection의 방법은 크게 4가지로 구분된다.
각각의 사용법에 대해 알아보려고 한다.
1. 프로퍼티 주입
● setter를 통해서 주입하기 때문에 setter가 필수로 있어야하며 엔티티의 명과 조회하려는 명칭이 잘 맞아야한다.
● 런타임시에 에러를 잡기때문에 테스트는 필수이다.
queryFactory
.select(Projections.bean(
MemberDto.class,
member.username,
member.age))
Projections.bean 을 사용하며 사용할 클래스를 선언한 뒤 setter가 선언된 프로퍼티명칭과 맞는 조회를 해야한다.
2. 필드 주입
● 필드 명칭에 맞춰서 주입되는 방법이며, setter나 생성자가 없어도 가능하다.
● 단) 필드명칭과 조회 명칭은 잘 맞춰야 한다.
● 필드 주입도 런타임시에 에러를 잡기때문에 테스트를 필수로 해야한다.
queryFactory
.select(Projections.fields(
MemberDto.class,
member.username,
member.age))
Projections.fields 사용
3. 생성자 주입
● 생성자를 통해 주입받기 때문에 생성자를 선언해주어야 한다.
● 런타임시에 에러를 잡는다.
Projections.constructor
Projections.constructor 사용
4. @QueryProjection
● QueryDsl을 사용하여 QMemberDto 생성하여 주입한다.
● 컴파일시에 에러를 잡아주기 때문에 querydsl 작성에 효율적이다.
● Dto 클래스단에서 queryDsl을 의존해야 하기때문에 고민의 여지가 있다.
.select(new QMemberDto(member.username,member.age))
결론
각 상황에 맞는 최적의 projection을 사용하면 되겠지만, Dto에서 querydsl을 의존하는게 크게 문제 되지않는다면 QueryProjection을 사용하여 컴파일시에 직관적으로 에러를 잡는게 더 좋다고 생각한다.
출처 - https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84