querydsl 프로젝트를 하면서 Dto 생성자에 @queryProjection 을 사용하는 코드를 보았습니다.
간단히, Q타입의 파일을 만들어주어, repository 에서 querydsl 코드를 작성할 때 도움을 주는 것으로 학습했는데, 조금 더 자세히 살펴보려고 합니다.
먼저, Projection 은 select 절에 대상을 지정하는 것입니다. 즉 테이블에서 원하는 컬럼만 뽑아서 조회할 수 있습니다.
Entity를 직접 사용하면 불필요한 데이터 값을 넘길 수 있는데, 원하는 컬럼만 뽑아 사용한다면 더욱 효율적인 코드를 작성할 수 있기에 충분히 사용할만한 가치가 있다고 생각합니다.
편리하지만 아키텍처에 관련해 고려해야 할 점이 있습니다.
Dto 클래스의 생성자가 QueryDsl 에 의존하게 됩니다.
또한, Repository 를 사용하는 컨트롤러나 서비스에서도 의존하게 됩니다.
만약 QueryDsl 를 이후에 사용하지 않을 경우에 전부 변경해주어야 하는 경우가 발생할 수 있습니다.하지만, 어노테이션 하나로 적용하기 때문에, 만약 기술을 변경하더라도 빠르게 해당 어노테이션을 수정 및 삭제 할 수 있다고 생각합니다.
이러한 의존성이 부담스럽다면 projection.Setter , Field, Constructor 방식을 사용하는 것이 방법이 될 수 있을 것 같습니다.
@queryProjection 을 사용하면 일반적인 Dto 를 사용하는 것이 아닌 Q타입의 Dto를 사용합니다.
사용하는 예시는 아래와 같습니다.
@Data
public class MemberTeamDto {
private Long memberId;
private String username;
private int age;
private Long teamId;
private String teamName;
@QueryProjection // select 절에 대상을 지정한다.
public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) {
this.memberId = memberId;
this.username = username;
this.age = age;
this.teamId = teamId;
this.teamName = teamName;
}
Dto 생성자에 @QueryProjection 어노테이션을 추가하면 Q타입의 클래스를 생성합니다.
아래와 같이 사용할 수 있습니다.
Q타입의 Dto 를 사용하기 때문에, 컴파일 시점에 에러를 잡아주게 되어 더욱 효율적으로 코드를 작성할 수 있습니다.
return queryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name))...
'Spring > JPA' 카테고리의 다른 글
OSIV ( Open Session In View ) 에 대해 알아보자. (1) | 2023.03.18 |
---|---|
JPA 벌크 연산 처리 방법 및 주의점 (0) | 2023.02.25 |
querydsl 다중 조건 검색 만들기 (0) | 2023.02.05 |
Querydsl 동적 쿼리 - 기초 예제 (0) | 2023.02.04 |
QueryDsl 설정 방법 - Spring boot 2.7.x (1) | 2023.02.03 |
댓글