Post

[Querydsl] ์กฐ์ธ(join)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 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์„ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๋ถ€ํ•˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์กฐ์ธ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์Šค๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด ์ตœ์ ํ™”ํ•˜์ž.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.