개요
- 데이터베이스에서 조회(SELECT) 하는 3가지의 방법
- 설렉션(Selection) - 행 단위로 원하는 데이터를 조회하는 방식
- 프로젝션(Projection) - 열 단위로 원하는 데이터를 조회하는 방식
- 조인(Join) - 두 개 이상의 테이블을 양옆에 연결하여 데이터를 조회하는 방식
- 즉, 프로젝션은 SELECT 를 통해 조회할 대상을 지정하는 것을 뜻한다.
- 프로젝션 결과를 DTO 로 직접 조회 해보자.
- 엔티티를 조회하여 DTO로 변환하지 않고, 리포지토리에서 DTO를 이용하여 바로 조회한다.
- 리포지토리 재사용성이 떨어짐, API 스펙에 맞춘 코드가 리포지토리에 들어가는 단점이다.
- 리포지토리는 가급적 순수한 엔티티를 조회하는데 사용하기 때문에 따로 DTO로 조회하여야 한다면 리포지토리를 만드는 것이 유지보수성에 좋다.
@QueryProjection
@Data
public class MemberDto {
private String userName;
private int age;
public MemberDto() {
}
@QueryProjection
public MemberDto(String userName, int age) {
this.userName = userName;
this.age = age;
}
}
- DTO 를 QClass 로 만들어서 사용하는 방식이다.
- 프로젝션할 때 사용할 DTO 의 생성자에
@QueryProjection 어노테이션을 붙인다.
- ./gradlew compileQuerydsl
- QMemberDto 생성 확인
@QueryProjection 활용
@Test
void findDtoByQueryProjection() {
//given
//when
List<MemberDto> result = jpaQueryFactory
.select(new QMemberDto(member.userName, member.age))
.from(member)
.fetch();
//then
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
- 장점
- 코드가 깔끔해진다.
- 컴파일러로 타입을 체크할 수 있다.
Projections 를 이용하면 런타임 시점에 오류를 체크할 수 있다.
@QueryProjection 를 사용하면 컴파일 시점에 오류를 잡을 수 있다.
- 단점
- Dto 가 querydsl 에 의존적 이게 된다.