๐Ÿคญ ๋ฏธ๋ฆฌ ์ฝ๊ณ  ์˜ค๋ฉด ์ข‹์€ ๊ธ€

 

[JPA] JPA, Hibernate, Spring Data JPA์— ๋Œ€ํ•œ ์ด๋Ÿฐ์ €๋Ÿฐ.. ์ •๋ฆฌ

โ˜๏ธ JPA ์ธํ„ฐํŽ˜์ด์Šค ๐Ÿซง EntityManagerFactory JPA ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ EntityManager ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ์—ญํ•  (์—ฌ๋Ÿฌ EntityManager ์ƒ์„ฑ ๊ฐ€๋Šฅ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด DB๋ฅผ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ EntityManagerFactory

chaewsscode.tistory.com

 

[JPA] Hibernate JPA EntityManager ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๐ŸŒฑ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ Entity ์ƒ๋ช…์ฃผ๊ธฐ ์—”ํ‹ฐํ‹ฐ๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒํƒœ๋ฅผ ์ „ํ™˜์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์„ EntityManager๊ฐ€ ์ œ๊ณตํ•œ๋‹ค. 1. Transient(๋น„์˜์†): ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ Java ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์กด์žฌํ•˜๊ณ ,

chaewsscode.tistory.com


1๏ธโƒฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€?

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋œปํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ€์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ํ•œ ๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

em.persist(member); // "์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•ด ํšŒ์› ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค"๋Š” ์˜๋ฏธ

 

2๏ธโƒฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋™์ž‘์›๋ฆฌ

๐ŸŒฑ member ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •

1. ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†ํ™”(persist)๋˜์–ด 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋œ๋‹ค.

2. ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— INSERT๋ฌธ์ด ์ƒ์„ฑ๋˜์–ด 1์ฐจ ์บ์‹œ์— ๋“ฑ๋ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ DB ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•  ์ค€๋น„๋ฅผ ํ•œ๋‹ค.

3. flush ๋ช…๋ น ์‹œ ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ์ฟผ๋ฆฌ๋“ค์ด ์‹คํ–‰๋˜๋ฉด์„œ 1์ฐจ ์บ์‹œ์™€ DB๊ฐ€ ๋™๊ธฐํ™”๋œ๋‹ค.

4. ๋งˆ์ง€๋ง‰์œผ๋กœ commit๊นŒ์ง€ ์™„๋ฃŒ๋˜๋ฉด 1์ฐจ ์บ์‹œ์˜ ๋‚ด์šฉ์ด ์™„์ „ํžˆ DB์— ๋ฐ˜์˜๋œ๋‹ค.

 

์œ„ ์ž‘์—…์€ ๋ชจ๋‘ ๋‹จ์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ผ์–ด๋‚œ๋‹ค.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ผ์–ด๋‚˜๋Š” ์ž‘์—…์„ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„์ด๋ฉฐ, ๋ชจ๋“  ์ž‘์—…์€ ์–ธ์ œ๋“  ROLLBACK ๋  ์ˆ˜ ์žˆ๋‹ค.

 

3๏ธโƒฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋ฒ”์œ„

ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์œผ๋ฉด, ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์ „๋žต์€ ๋‹ค์–‘ํ•œ ์œ„์น˜์—์„œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

@Repository
class Repo1 {
    @PersistenceContext EntityManager em;
    
    public void logic1(){
    	em.xxx(); // Repo1์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์ ‘๊ทผ
    }
}


@Repository
class Repo2 {
    @PersistenceContext EntityManager em;
    
    public void logic2(){
    	em.xxx(); // Repo2์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์ ‘๊ทผ
    }
}

 

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์•„๋ž˜ logic()์„ ์‹คํ–‰ํ•˜๋Š” ์ƒํ™ฉ์„ ์˜ˆ๋กœ ๋“ค๋ฉด

@Service
class MainService{
    @Autowired Repo1 repo1;
    @Autowired Repo2 repo2;
    
    @Transctional
    public void logic(){
    	repo1.logic1();
        repo2.logic2(); 
    }
}

 

repo1๊ณผ repo2์˜ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ๋‹ค๋ฅด์ง€๋งŒ, ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋™์ผํ•˜๋‹ค.


ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅด๋ฉด, ๋‹ค๋ฅธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋‹ค๋ฅธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ƒํ™ฉ์— ์•ˆ์ „ํ•˜๋‹ค.

 

4๏ธโƒฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์ 

  • 1์ฐจ ์บ์‹œ
  • ๋™์ผ์„ฑ ๋ณด์žฅ
  • ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)
  • ์“ฐ๊ธฐ ์ง€์—ฐ
  • ์ง€์—ฐ ๋กœ๋”ฉ

1) 1์ฐจ ์บ์‹œ

๐ŸŒฑ member ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ณผ์ •

1. EntityManager๊ฐ€ ์กฐํšŒ(find)๋ฅผ ์š”์ฒญํ•œ๋‹ค.

2. 1์ฐจ ์บ์‹œ์—์„œ ์šฐ์„ ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ  ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ DB SELECT๋ฌธ์„ ์‹คํ–‰ํ•˜์—ฌ ์กฐํšŒํ•œ๋‹ค.

3. ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ  ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜(return)ํ•œ๋‹ค.

 

์ดํ›„ ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ 1์ฐจ ์บ์‹œ์—์„œ ๋ฐ”๋กœ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

 

2) ๋™์ผ์„ฑ ๋ณด์žฅ

1์ฐจ ์บ์‹œ๋Š” flush๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š” ์ด์ƒ DB์™€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ 1์ฐจ ์บ์‹œ์— ์กด์žฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ์–ธ์ œ๋‚˜ ๋™์ผํ•œ ์—”ํ‹ฐํ‹ฐ์ด๋‹ค.

Member findMember1 = em.find(Member.class, 10L);
Member findMember2 = em.find(Member.class, 10L);

System.out.println("findMember = " + (findMember1 == findMember2));

 

๋”ฐ๋ผ์„œ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ == ๋น„๊ต ์‹œ ๋™์ผํ•œ ์ฐธ์กฐ๊ฐ€ ๋‚˜์™€ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

3) ์“ฐ๊ธฐ ์ง€์—ฐ

์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ ธ SQL๋ฌธ์ด ์ƒ์„ฑ๋˜์–ด๋„ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฆ์€ I/O ๋ฐœ์ƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜, ์›ํ•˜๋Š” ์‹œ์ ์— ๊ฐœ๋ฐœ์ž๊ฐ€ SQL๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก flush ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿค” flush๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ

  1. entitymanager.flush(): ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœ
  2. tx.commit(): ์ž๋™ ์‹คํ–‰
    • ์ปค๋ฐ‹ ์ „ ์ €์žฅ์†Œ์— ์žˆ๋Š” SQL๋ฌธ๋“ค์„ flush ํ•˜์—ฌ ์‹คํ–‰์‹œํ‚จ ํ›„, DB์— ๋ฐ˜์˜ํ•œ๋‹ค.
  3. JPQL ์ฟผ๋ฆฌ ์‹คํ–‰: ์ž๋™ ์‹คํ–‰
    • JPQL์€ JPA ๋งž์ถค SQL ์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค. JPQL์€ EntityManager๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ๋กœ ํŒŒ์‹ฑ ๋˜์–ด SQL๋ฌธ์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ DB์— ์‹คํ–‰๋œ๋‹ค.
      ๋”ฐ๋ผ์„œ ์ด์ „์— ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์ €์žฅํ–ˆ๋˜ SQL๋ฌธ๋“ค์„ ๋จผ์ € flush ํ•ด์•ผ ๋ฐ์ดํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

 

4) ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ์˜ ์ฒ˜์Œ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค.

 

๐ŸŒฑ member ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •

1. ๊ฐœ๋ฐœ์ž๊ฐ€ find()๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

2. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋ฅผ setter ํ•จ์ˆ˜๋กœ ํ•„๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

โ—๏ธ ์ฒ˜์Œ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท๊ณผ ๋™์ผํ–ˆ๋˜ ๊ณผ๊ฑฐ์™€ ๋‹ฌ๋ฆฌ, ๋”๋Ÿฝํ˜€์กŒ๋‹ค.(Dirty)

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ ์Šค๋ƒ…์ƒท๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์–ผ๋งˆ๋‚˜ ๋”๋Ÿฌ์›Œ์กŒ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ Dirty Checking ์ฆ‰, ๋ณ€๊ฒฝ๊ฐ์ง€๋ผ ๋ถ€๋ฅธ๋‹ค.

๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์ž๋™์œผ๋กœ UPDATE๋ฌธ์„ ์ƒ์„ฑํ•˜์—ฌ ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ˆœํžˆ ํ•„๋“œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ธ๋ฐ ์ž๋™์œผ๋กœ UPDATE๋ฌธ๊นŒ์ง€ ์ƒ์„ฑ๋˜์–ด ์†์‰ฌ์šด ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

5) ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

๐ŸŒฑ ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading)

์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘์˜ fetch ์†์„ฑ์„ FetchType.EAGER๋กœ ์ง€์ •ํ•ด ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ์‹œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•œ๋‹ค.

 

public class Member {
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TEAM_ID")    
    private Team team;
}
SELECT 
	...
FROM 
	MEMBER M LEFT OUTER JOIN TEAM T
		ON M.TEAM_ID=T.TEAM_ID
WHERE
	M.MEMBER_ID="id"

 

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•œ๋‹ค.

์ด๋•Œ, ์‹คํ–‰๋˜๋Š” SQL์€ ์™ธ๋ถ€ ์กฐ์ธ(LEFT OUTER JOIN)์„ ์‚ฌ์šฉํ•œ๋‹ค. (ํšŒ์›์€ ํŒ€์ด ์—†์„ ์ˆ˜ ์žˆ์–ด NULL๊ฐ’์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”์—์„œ๋Š” ๋‚ด๋ถ€ ์กฐ์ธ(INNER JOIN)์ด ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— @JoinColumn(nullable = false)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐ŸŒฑ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘์˜ fetch ์†์„ฑ์„ FetchType.LAZY๋กœ ์ง€์ •ํ•ด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒํ•œ๋‹ค.

 

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

 

ํšŒ์› ์กฐํšŒ ์‹œ ๋ฐ”๋กœ ํŒ€์„ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ , team ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ํ”„๋ก์‹œ ๊ฐ์ฒด(๊ฐ€์งœ ๊ฐ์ฒด)๋ฅผ ๋„ฃ์–ด๋‘”๋‹ค.

๊ทธ ํ›„ team์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— DB๋ฅผ ์กฐํšŒํ•ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค.

๋งŒ์•ฝ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๊ฐ์ฒด๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•  ๊ฒฝ์šฐ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ง€์—ฐ ๋กœ๋”ฉ์ด ํ•ญ์ƒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํŒ€๊ณผ ํšŒ์›์„ ํ•ญ์ƒ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์™„๋ฃŒ ๋‹จ๊ณ„์— ์™”์„ ๋•Œ, ์‹ค์ œ ์‚ฌ์šฉ ์ƒํ™ฉ์„ ๋ณด๋ฉฐ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

 

 

 

[JPA] ํ”„๋ก์‹œ, ์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์—ฐ๋กœ๋”ฉ

ํ”„๋ก์‹œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ํ•ญ์ƒ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํšŒ์›์„ ์กฐํšŒํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ํšŒ์›์ด ๊ฐ€์ž…ํ•œ ํŒ€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ํšŒ์›์„ ์กฐํšŒํ•  ๋•Œ ํ•ญ์ƒ ํŒ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜

girawhale.tistory.com

 

[JPA] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์  ( + DirtyChecking )

[JPA] JPA ๋™์ž‘์›๋ฆฌ ( ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ) [JPA] ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์€ ์ฃผ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋Š” ํ˜„์‹ค์˜ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ฐ์ด

lordofkangs.tistory.com

 

[JPA] OSIV ๋ž€?

์Šคํ”„๋ง์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŠธ๋žœ์žญ์…˜๊ณผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ด๋Ÿฌํ•œ JPA์˜ ๋‚ด๋ถ€ ๋™์ž‘์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ 

ttl-blog.tistory.com

 

ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

์ˆœ์ˆ˜ํ•˜๊ฒŒ J2SE ํ™˜๊ฒฝ์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜๋„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ŠคํŠธ๋ง์ด๋‚˜ J2EE ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ „๋žต

devbksheen.tistory.com