Skip to content

QueryDsl More Type safety

정명주(myeongju.jung) edited this page Oct 14, 2017 · 11 revisions

본 문서는 QueryDsl를 더 Type-safety 하게 쓸수 있는 팁을 정리하는 문서임.

Projections.constructor isn't Type-safety

  • Projections.constructor 를 사용하는 경우 생성자의 시그네쳐가 변경되는 경우 컴파일 시 오류를 찾을 수 없음.

AS-IS

Projections.constructor

PartnerRepository.java

QPartner partner = QPartner.partner;
QCompany company = QCompany.company;

return from(partner, company)
    .where(predicate)
    .select(Projections.constructor(PartnerSummary.class, partner, company))
    .fetch();

PartnerSummary의 생성자의 시그네쳐가 바뀌면 ??

  • Runtime 시 확인가능

TO-BE

@QueryProjection

PartnerRepository.java

QPartner partner = QPartner.partner;
QCompany company = QCompany.company;

return from(partner, company)
    .where(predicate)
    .select(new QPartnerSummary(partner, company))
    .fetch();

PartnerSummary의 생성자의 시그네쳐가 바뀌면 ??

  • Compile 시 확인가능

PartnerSummary.java

@Value    // !!
public class PartnerSummary {
    @QueryProjection    // !!
    public PartnerSummary(Partner partner, Company company) {
        // ...
    }
}
  • 출력용 DTO에 @QueryProjection를 설정해서 해당 생성자의 QType를 만들어서 사용한다.

Conclusion

@QueryProjection is better than Projections.constructor

  • Projections.constructor 보다 DTO 생성자에 @QueryProjection를 설정해서 해당 생성자의 QType를 만들어서 사용하는 것이 더 Type-safety하다.
  • 그리고 DTO 일지라도 출력(조회)를 위한 DTO 라면 값객체 형태로써 불변화 시키는 것이 더 Side-effect 없는 코드가 된다.
Clone this wiki locally