[241214] QueryDSL์ด๋?
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 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ฉฐ, ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ๋ก๋ฉ์ ๋ฐฉ์งํ๋ค.