[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 15. JPQL - ํŽ˜์น˜ ์กฐ์ธ(fetch join)

2023. 3. 5. 18:07ยทSpring/Spring JPA ๊ธฐ๋ณธ

 

 

JPQL - ํŽ˜์น˜ ์กฐ์ธ(fetch join)

 

SQL ์กฐ์ธ ์ข…๋ฅ˜๊ฐ€ ์•„๋‹Œ JPQL ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ SQL ํ•œ๋ฒˆ์— ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. 

 

 

 

 

์˜ˆ์‹œ) SQL ํ•œ๋ฒˆ์— ํšŒ์›์„ ์กฐํšŒํ•˜๋ฉด์„œ ์—ฐ๊ด€๋œ ํŒ€๋„ ํ•จ๊ป˜ ์กฐํšŒ

 

 

JPQL

select m from Member m join fetch m.team

 

 

 

SQL

SELECT M.*, T.* FROM MEMBER M
INNER JOIN TEAM T ON M.TEAM_ID=T.ID

 

SQL ์„ ๋ณด๋ฉด ํšŒ์› ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€(T.*)๋„ ํ•จ๊ป˜ select ํ•œ๋‹ค. 

 

 

 

 

ํŽ˜์น˜ ์กฐ์ธ์ด ์•„๋‹Œ ๊ทธ๋ƒฅ ์กฐํšŒํ•  ๋•Œ 

String query = "select m from Member m ";
List<Member> result = em.createQuery(query, Member.class)
        .getResultList();

for (Member member : result) {
    System.out.println("userName = " + member.getUsername() + ", teamName " + member.getTeam().getName());
}

 

 

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;

๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•  ๋•Œ ํŒ€์ด fetchType.LAZY ์ด๊ธฐ ๋•Œ๋ฌธ์— 

 

ํ”„๋ก์‹œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด๋•Œ ๋ฉค๋ฒ„๋ฅผ ๋‹ค ์กฐํšŒํ•˜๊ณ  

 

ํŒ€์€ ๊ทธ ๊ฐ’์„ ์ด์šฉํ• ๋•Œ ( member.getTeam().getName() ํ˜ธ์ถœ์‹œ ) 

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค. 

 

 

member.getTeam().getName() ํ˜ธ์ถœ์‹œ  ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ„๋‹ค. 

 

 

 

// ํšŒ์›1 - ํŒ€A ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—†๊ธฐ ๋•Œ๋ฌธ์— SQL ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

 

// ํšŒ์›2 - ํŒ€A ๋Š” 1์ฐจ์บ์‹œ(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค 

 

 

// ํšŒ์›3 - ํŒ€B ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—†๊ธฐ ๋•Œ๋ฌธ์— SQL ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

 

 

์ฟผ๋ฆฌ๊ฐ€ ๋งŽ์ด ๋‚˜๊ฐ€๋Š”๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค. 

 

ํšŒ์› 100๋ช…์ด๋ฉด ๋‚ด๊ฐ€ ๋ณด๋‚ธ ์ฟผ๋ฆฌ 1๊ฐœ๋กœ 100๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค. ( N+1 ๋ฌธ์ œ ) 

 

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์€ ํŽ˜์น˜ ์กฐ์ธ์œผ๋กœ ํ’€์–ด์•ผํ•œ๋‹ค.

 

 

์—”ํ‹ฐํ‹ฐ ํŽ˜์น˜ ์กฐ์ธ

select m from Member m join fetch m.team

 

 

 

๋ฉค๋ฒ„์™€ ํŒ€์„ ์กฐ์ธํ•ด์„œ ํ•œ๋ฒˆ์— ๊ฐ€์ง€๊ณ  ์™”๋‹ค. 

 

ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ด

 

 

 

 

 

์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ

 

์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ์˜ ์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ์„ ์•Œ์•„๋ณด์ž 

 

 

JPQL

select t from Team t join fetch t.members

 

 

SQL

SELECT T.*, M.*
    FROM TEAM T
    INNER JOIN MEMBER M ON T.ID=M.TEAM_ID

 

 

์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ปฅํŠ€๊ธฐ ๋  ์ˆ˜ ์žˆ์Œ 

 

 

 

 

select distinct t from Team t join fetch t.members

 

๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต ๋˜๊ธฐ ๋•Œ๋ฌธ์—  DISTINCT ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•˜์ž 

 

 

 

ํŽ˜์น˜ ์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ SQL ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค ! 

 

ํŽ˜์น˜ ์กฐ์ธ์˜ ํ•œ๊ณ„

 

ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์—๋Š” ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์—†๋‹ค. ๊ฐ€๊ธ‰์  ์‚ฌ์šฉํ•˜์ง€๋ง์ž ! 

 

๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์€ ํŽ˜์น˜ ์กฐ์ธ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

 

์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•˜๋ฉด ํŽ˜์ด์ง• API 

(setFirstResult,setMaxResults)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 

 

 

์ •๋ฆฌ

 

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ SQL ํ•œ ๋ฒˆ์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค. (์„ฑ๋Šฅ์ตœ์ ํ™”)

 

FetchType.LAZY ์ด์—ฌ๋„ ํŽ˜์น˜ ์กฐ์ธ์ด ํ•ญ์ƒ ์šฐ์„ ์ด๋‹ค. 

 

์‹ค๋ฌด์—์„œ๋Š” ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ํ•˜๊ณ  ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์€ ํŽ˜์น˜ ์กฐ์ธ์„ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

 

 

 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com

 

์ €์ž‘์žํ‘œ์‹œ

'Spring > Spring JPA ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 14. ํŽ˜์ด์ง• API / ์กฐ์ธ / ์„œ๋ธŒ ์ฟผ๋ฆฌ  (0) 2023.03.04
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 13. JPQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ• / ์ฟผ๋ฆฌ API  (0) 2023.03.04
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 12. ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด(JPQL) ์†Œ๊ฐœ  (0) 2023.03.04
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 11. ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… / ๊ฐ’ ํƒ€์ž…  (0) 2023.03.03
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 10. ์˜์†์„ฑ ์ „์ด CASCADE / ๊ณ ์•„ ๊ฐ์ฒด  (0) 2023.03.01
'Spring/Spring JPA ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 14. ํŽ˜์ด์ง• API / ์กฐ์ธ / ์„œ๋ธŒ ์ฟผ๋ฆฌ
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 13. JPQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ• / ์ฟผ๋ฆฌ API
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 12. ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด(JPQL) ์†Œ๊ฐœ
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 11. ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… / ๊ฐ’ ํƒ€์ž…
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 15. JPQL - ํŽ˜์น˜ ์กฐ์ธ(fetch join)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”