QueryDsl More Type safety - redutan/redutan.github.io GitHub Wiki
๋ณธ ๋ฌธ์๋ 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 ์๋ ์ฝ๋๊ฐ ๋๋ค.