๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป๐Ÿ“

[241214] QueryDSL์ด๋ž€?

_silver 2024. 12. 14. 18:30

QueryDSL์€ Java ๊ธฐ๋ฐ˜์˜ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋„๊ตฌ๋กœ, JPQL์„ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณด์™„ํ•˜์—ฌ ๋” ๊ฐ€๋…์„ฑ ๋†’์€ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

ORM ํ”„๋ ˆ์ž„์›Œํฌ์ธ JPA์™€ ํ•จ๊ป˜ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

 

   // QueryDRL์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋™์  ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public List<Reservation> searchReservations(Long userId, Long itemId) {

        // QueryDRL์—์„œ ์ƒ์„ฑ๋œ Qํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•˜์—ฌ ๊ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐ
        QReservation reservation = QReservation.reservation;
        QUser user = QUser.user;
        QItem item = QItem.item;

        // QueryDRL์„ ํ†ตํ•ด ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰
        return jpaQueryFactory
                .selectFrom(reservation)    // ์˜ˆ์•ฝ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฟผ๋ฆฌ ์ง„ํ–‰
                .leftJoin(reservation.user, user).fetchJoin() //user ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋กœ๋“œ (fetchJoin์œผ๋กœ N+1 ๋ฌธ์ œ ๋ฐฉ์ง€)
                .leftJoin(reservation.item, item).fetchJoin() //item ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋กœ๋“œ (fetchJoin์œผ๋กœ N+1 ๋ฌธ์ œ ๋ฐฉ์ง€)
                .where(
                        userId !=null ? reservation.user.id.eq(userId) : null,  // userId ์กฐ๊ฑด ์ถ”๊ฐ€(์กด์žฌํ•  ๊ฒฝ์šฐ)
                        itemId !=null ? reservation.item.id.eq(itemId) : null   // itemId ์กฐ๊ฑด ์ถ”๊ฐ€(์กด์žฌํ•  ๊ฒฝ์šฐ)
                )
                .fetch();

 

QueryDSL ์ฃผ์š” ๊ฐœ๋…

1. Q ํด๋ž˜์Šค

- QReservation, QUser, QItem ์€ QueryDSL์ด ์ž๋™ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค์ด๋‹ค.

- ๊ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ Java์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ฟผ๋ฆฌ ์ž‘์„ฑ์‹œ IDE์˜ ์ฝ”๋“œ ์ž๋™ ์™„์„ฑ๊ณผ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

- QReservation.reservation์€ Reservation ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” Q ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

- ํ•„๋“œ์— ์ ‘๊ทผํ•  ๋•Œ reservation.user, reservation.id์ฒ˜๋Ÿผ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. JPAQueryFactory

- QueryDSL์˜ ํ•ต์‹ฌ ๋„๊ตฌ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

- .selectFrom(),

         .leftJoin(),

           .where(),

             .fetch() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

3. where() ์กฐ๊ฑด

- ์กฐ๊ฑด์ ˆ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

- reservation.user.id.eq(userId)๋Š” userId์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋ง ํ•œ๋‹ค.

- ์กฐ๊ฑด์„ null ์ฒดํฌ์™€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. fetchJoin()

- JPA์˜ N+1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

- ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.