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 ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.