[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 9. ์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ

2023. 3. 1. 16:48ยทSpring/Spring JPA ๊ธฐ๋ณธ

 

์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ

 

Member findMember = em.find(Member.class, member.getId());

 

Member ๋ฅผ ์กฐํšŒํ•  ๋•Œ Team ๋„ ํ•จ๊ป˜ ์กฐํšŒํ•ด์•ผ ํ• ๊นŒ?

 

 

 

๋‹จ์ˆœํžˆ member ์ •๋ณด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋ผ๋ฉด 

 

member๋ฅผ ์กฐํšŒํ•  ๋•Œ team ๊นŒ์ง€ join ํ•ด์„œ ๊ฐ€์ ธ์˜ค๋ฉด ์†ํ•ด์ด๋‹ค. 

 

 

 

๊ทธ๋ž˜์„œ JPA ๋Š” ์ง€์—ฐ๋กœ๋”ฉ์ด๋ผ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค. 

 

 

์ง€์—ฐ๋กœ๋”ฉ (fetch = FetchType.LAZY)

@Entity
public class Member {

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

 

 

team ๊นŒ์ง€ join ํ•ด์„œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  member ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค. 

 

์–ด๋–ป๊ฒŒ team ๊ฐ์ฒด๋Š” ์กฐํšŒ๋˜์ง€ ์•Š์„๊นŒ?

 

Member findMember = em.find(Member.class, member.getId());
System.out.println("findTeam = " + findMember.getTeam().getClass());

 

 

team ๊ฐ์ฒด๋ฅผ fetch = fetchType.LAZY ๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ํ”„๋ก์‹œ๋กœ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค .

 

 

 

 

 

System.out.println("===============");
findMember.getTeam().getName();
System.out.println("===============");

 

 

ํ”„๋ก์‹œ๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•œ(์‚ฌ์šฉ๋˜๋Š”) ์‹œ์  ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ„๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” getName()ํ˜ธ์ถœ ์‹œ)

 

 

 

 

๋งŒ์•ฝ Member ์™€ Team ์„ ์ž์ฃผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

 

์ฆ‰์‹œ๋กœ๋”ฉ (fetch = FetchType.EAGER)

@Entity
public class Member {
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "team_id")
    private Team team;

 

 

 

์ฆ‰์‹œ ๋กœ๋”ฉ์€ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ์‹œ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ํ•œ๋ฒˆ์— ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. 

 

์—ฌ๊ธฐ์„œ๋Š” member ์กฐํšŒ์‹œ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” team ๊นŒ์ง€ ์กฐํšŒ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. 

 

 

 

 

ํ”„๋ก์‹œ์™€ ์ฆ‰์‹œ๋กœ๋”ฉ ์ฃผ์˜

 

์‹ค๋ฌด์—์„œ๋Š” ์ฆ‰์‹œ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž ! 

 

( ๋ฐ์ดํ„ฐ๋ฅผ join ํ•ด์„œ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์ข‹์€๊ฑฐ ์•„๋‹Œ๊ฐ€? ) 

 

 

๋ฌธ์ œ์  --->

 

 

์ฆ‰์‹œ๋กœ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ SQL์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

N+1 ๋ฌธ์ œ

 

์ฆ‰์‹œ๋กœ๋”ฉ์€ JPQL์—์„œ N+1 ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค. 

 

N+1 : ์ตœ์ดˆ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜(1) ๋‚ ๋ ธ๋Š”๋ฐ ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ N ๊ฐœ๊ฐ€ ๋‚˜๊ฐ€๋Š” ๋ฌธ์ œ 

 

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

 

JPQL ์—์„œ๋Š” SQL ๋กœ ๋ฒˆ์—ญํ•œ ๋‹ค์Œ ์‹คํ–‰ํ•œ๋‹ค. ( SQL : select * from Member )

 

 

์—ฌ๊ธฐ์„œ๋Š” Member ๋งŒ select ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค. 

 

@Entity
public class Member {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "team_id")
    private Team team;

 

Member ๋ฅผ ๊ฐ€์ง€๊ณ  ์™”๋Š”๋ฐ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” team ์ด ์ฆ‰์‹œ๋กœ๋”ฉ(EAGER) ์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๋‹ค .

 

--> LAZY ๋ฉด ํ”„๋ก์‹œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜์ง€๋งŒ , EAGER ๋Š” team ์— ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. 

 

 

 

๊ทธ๋ž˜์„œ team ์˜ ๊ฐ’์„ ์–ป๊ธฐ์œ„ํ•œ SQL์ด ๋‚˜๊ฐ„๋‹ค. ( SQL : select * from Team where team_id = xxx )

 

 

 

 

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

 

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

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

www.inflearn.com

 

 

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

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

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 11. ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… / ๊ฐ’ ํƒ€์ž…  (0) 2023.03.03
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 10. ์˜์†์„ฑ ์ „์ด CASCADE / ๊ณ ์•„ ๊ฐ์ฒด  (0) 2023.03.01
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 8. ํ”„๋ก์‹œ  (0) 2023.03.01
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 7. @MappedSuperclass  (0) 2023.02.28
[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 6. ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘ / @Inheritance  (0) 2023.02.28
'Spring/Spring JPA ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 11. ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… / ๊ฐ’ ํƒ€์ž…
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 10. ์˜์†์„ฑ ์ „์ด CASCADE / ๊ณ ์•„ ๊ฐ์ฒด
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 8. ํ”„๋ก์‹œ
  • [์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 7. @MappedSuperclass
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 ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 9. ์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ
์ƒ๋‹จ์œผ๋กœ

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