๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ QueryDSL์ ์กฐ์ธ(Join)์ ์ ๋ฆฌํ๋ค. ์ฌ๋ฌ ํ
์ด๋ธ ๊ฐ ๊ด๊ณ๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ค์ํ ๋ฐฉ์์ ์ดํด๋ณธ๋ค.
| ์ข
๋ฅ | ์ค๋ช
|
|---|
| Inner Join | ์์ชฝ์ ์ผ์นํ๋ ๊ฒ๋ง |
| Left Join | ์ผ์ชฝ ์ ๋ถ + ์ผ์นํ๋ ์ค๋ฅธ์ชฝ |
| Fetch Join | ์ฐ๊ด ์ํฐํฐ๋ฅผ ํจ๊ป ๋ก๋ฉ(N+1 ํด๊ฒฐ) |
1. Inner Join
1
2
3
4
| List<Order> orders = queryFactory
.selectFrom(order)
.innerJoin(order.customer, customer) // ์ผ์นํ๋ ๊ฒ๋ง
.fetch();
|
2. Left Join
1
2
3
4
| List<Order> orders = queryFactory
.selectFrom(order)
.leftJoin(order.customer, customer) // order ์ ๋ถ + ์์ผ๋ฉด customer
.fetch();
|
3. Fetch Join โ N+1 ํด๊ฒฐ
1
2
3
4
| List<Order> orders = queryFactory
.selectFrom(order)
.innerJoin(order.customer, customer).fetchJoin() // ํจ๊ป ๋ก๋ฉ
.fetch();
|
๐ก Fetch Join์ ์ฐ๊ด ์ํฐํฐ(customer)๋ฅผ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ํจ๊ป ๊ฐ์ ธ์ N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. (์ผ๋ฐ join์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ๋ง ํ๊ณ , ์ฐ๊ด ์ํฐํฐ๋ ์ง์ฐ ๋ก๋ฉ๋จ)
4. On ์ โ ์กฐ์ธ ์กฐ๊ฑด ์ถ๊ฐ
1
2
3
4
5
| List<Order> orders = queryFactory
.selectFrom(order)
.leftJoin(order.customer, customer)
.on(customer.grade.eq("VIP")) // ์กฐ์ธ ์กฐ๊ฑด ์ถ๊ฐ
.fetch();
|
๐ก on์ผ๋ก ์กฐ์ธ ์์ ์ ์ถ๊ฐ ์กฐ๊ฑด์ ๊ฑด๋ค. (VIP ๋ฑ๊ธ ๊ณ ๊ฐ๋ง ์ฐ๊ฒฐ)
๐ ์ฃผ์์ฌํญ๊ณผ ํ
โ ๏ธ Fetch Join์ N+1์ ํด๊ฒฐํ์ง๋ง, ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. ์กฐ์ธ ์กฐ๊ฑด์ ๋ช
ํํ ํด ์๋์น ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ง์. ์ธ๋ฑ์ค๋ ๊ณ ๋ คํ๋ฉด ์ฑ๋ฅ์ด ํฅ์๋๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
| QueryDSL ์กฐ์ธ
โโ innerJoin ์ผ์นํ๋ ๊ฒ๋ง
โโ leftJoin ์ผ์ชฝ ์ ๋ถ + ์ผ์น ์ค๋ฅธ์ชฝ
โโ fetchJoin() ์ฐ๊ด ์ํฐํฐ ํจ๊ป ๋ก๋ฉ (N+1 ํด๊ฒฐ)
โโ on() ์กฐ์ธ ์กฐ๊ฑด ์ถ๊ฐ
|
| ๊ฐ๋
| ํ ์ค ์ ์ |
|---|
| Inner/Left Join | ๊ต์งํฉ / ์ผ์ชฝ ๊ธฐ์ค |
| Fetch Join | ์ฐ๊ด ์ํฐํฐ ํจ๊ป ๋ก๋ฉ |
| on | ์กฐ์ธ ์ ์ถ๊ฐ ์กฐ๊ฑด |
์กฐ์ธ์ ํต์ฌ์ Fetch Join์ผ๋ก N+1์ ํด๊ฒฐํ๋ค๋ ๊ฒ์ด๋ค. ๋ค๋ง ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋ถํ๊ฐ ๋ ์ ์์ผ๋, ์กฐ์ธ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ๊ณ ๋ คํด ์ต์ ํํ์.
Comments powered by Disqus.