Dev-Kyuu
article thumbnail

 

제λͺ©μ€ λ‚΄κ°€ μš”μ¦˜ κ΅¬κΈ€λ§ν• λ•Œ μ•„μ£Ό μ• μš©ν•˜λŠ” ν‚€μ›Œλ“œμΈλ° γ…‡γ…‡κ°€ 뭔데 λΌλŠ” ν‚€μ›Œλ“œμ΄λ‹€

근데 μ§„μ§œ 거짓말 μ•ˆν•˜κ³  이걸둜 κ²€μƒ‰ν•˜λ©΄ λ‚˜μ˜ μˆ˜μ€€κ³Ό λΉ„μŠ·ν•œλΆ„λ“€μ΄ ν•œ λ§Ίν˜€μ„œ μ‰½κ²Œ μ„€λͺ…ν•΄μ£Όμ‹  ν¬μŠ€νŒ…λ“€μ΄ 있음

λ‚˜λ„ μƒˆλ‘œ μ•Œκ²Œλœ 지식을 μ •λ¦¬ν•˜λŠ” ν¬μŠ€νŒ…μ€ 이 ν‚€μ›Œλ“œλ‘œ 써볼까 함 

 

이걸 μ°Ύμ•„λ³΄κ²Œ 된 κ³„κΈ°λŠ” μ›”μš”μΌ 기술 λ§€λ‹ˆμ €λ‹˜ μˆœνšŒλ•Œ 우리쑰 λŒ€μž₯λ‹˜μ˜ 진행도λ₯Ό 보고 κΈ°μˆ λ§€λ‹ˆμ €λ‹˜μ΄ CRUD κΈ°λŠ₯을 λ‹€ κ΅¬ν˜„ν•˜μ…¨μœΌλ©΄

μ„œλΉ„μŠ€μ—μ„œ @Transection μ–΄λ…Έν…Œμ΄μ…˜μ„ μ œμ™Έν•˜κ³  κ΅¬ν˜„ν•΄λ³΄μ„Έμš” ~ 라고 νžŒνŠΈλŠ” μ˜μ†μ„±μž…λ‹ˆλ‹€! 라고 μ•Œλ €μ£Όμ…”μ„œ μ°Ύμ•„λ³΄κ²Œλ˜μ—ˆλ‹€.

 

사싀 μ•žλ’€ λ‹€ μ‘°μ–Έν•΄μ£Όμ‹ κ²Œ 생각이 λ‚˜μ§ˆ μ•Šμ•˜λ˜ λ‚˜λŠ” μ†ŒμŠ€μ½”λ“œμ—μ„œ λ°”μ•„λ‘œ  νŠΈλžœμž­μ…˜ μ–΄λ…Έν…Œμ΄μ…˜λ§Œ 빼보고 γ…‹γ…‹ μ‹€ν–‰ν–ˆλŠ”λ° 잘 μ•ˆλ˜λŠ” 것 

μ°Ύμ•„λ³΄λ‹ˆ Transectional μ–΄λ…Έν…Œμ΄μ…˜ 없이 UPdateλ₯Ό ν•˜λ €λ©΄ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ λΌλŠ” κ°œλ…μ„ λ¨Όμ € ν•™μŠ΅ν•΄μ•Ό 됐닀.

 

 

πŸ§‘πŸ»‍πŸ’»  κ·Έλž˜μ„œ μ˜μ†μ„±μ΄ 뭔데?

JPAμ—μ„œμ˜ μ˜μ†μ„±μ€, Entityλ₯Ό 영ꡬ적으둜 μ €μž₯ν•΄μ£ΌλŠ” ν™˜κ²½μ„ 의미

: Entity Managerλ₯Ό μ΄μš©ν•΄ Entityλ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ‘°νšŒν•  λ•Œ EntityManagerλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— Entityλ₯Ό λ³΄κ΄€ν•˜κ³  관리함
: μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” λˆˆμ— λ³΄μ΄μ§€μ•ŠλŠ” 논리적 κ°œλ…μ΄λ©°, Entity λ§€λ‹ˆμ €λ₯Ό ν•˜λ‚˜ 생성할 λ•Œ ν•˜λ‚˜μ˜ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ λ§Œλ“€μ–΄μ§„λ‹€.

* μ°Έκ³  : JPAλŠ” νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν•˜λŠ” μˆœκ°„ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μƒˆλ‘œ μ €μž₯된 Entityλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— 반영(Flush)ν•œλ‹€.

 

 

πŸ”Ž Entity의 생λͺ…μ£ΌκΈ°λ₯Ό ν†΅ν•œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ κ°œλ… ν™•μΈν•˜κΈ°

λΉ„μ˜μ†(New/transient)

: 객체λ₯Ό μƒμ„±λ§Œ ν•œ μƒνƒœλ‘œ μ˜μ†μ„± 관계와 μ „ν˜€ 관계가 μ—†λŠ” μƒνƒœ 

 

μ˜μ†(Managed)

: 객체가 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯된 μƒνƒœ

EntityManager.persist(entity);
// Entityκ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” μƒνƒœ 

transcation.commit();
// νŠΈλžœμž­μ…˜ commit μ‹œμ μ˜ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μžˆλŠ” 정보듀이 DB에 쿼리둜 μ „μ†‘λœλ‹€

μ€€μ˜μ†(Detached)

: μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ μ €μž₯λ˜μ—ˆλ‹€κ°€ λΆ„λ¦¬λœ μƒνƒœ = μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ μ§€μš΄μƒνƒœ(JPAκ°€ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 객체)

entityManager.remove(entity);

μ‚­μ œ(Remove)

: μ‹€μ œ DB μ‚­μ œλ₯Ό μš”μ²­ν•œ μƒνƒœ

 

 

πŸ“Œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ μ‚¬μš©μ‹œ 이점

 

1. 1μ°¨ μΊμ‹œ / μ—”ν‹°ν‹° 동일성 보μž₯

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” 내뢀에 μΊμ‹œλ₯Ό κ°–κ³ μžˆμ–΄(Id, instance의 λ§΅ν˜•νƒœ) 엔티티듀이 μ €μž₯λœλ‹€.
  • μ—”ν‹°ν‹° μ‘°νšŒμ‹œ DB에 μ ‘κ·Όν•˜μ—¬ memberλ₯Ό νƒμƒ‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 1μ°¨ μΊμ‹œλ₯Ό ν›‘μ–΄μ„œ member1을 λ°”λ‘œ 찾을 수 있고 
  • λ§Œμ•½ μΊμ‹œμ— μ—†λ‹€λ©΄ DBμ—μ„œ 검색 ν›„ ν•΄λ‹Ή 객체λ₯Ό 1μ°¨ μΊμ‹œμ— μ €μž₯ν•˜κ³  λ°˜ν™˜ν•¨
  • 이런 1μ°¨ μΊμ‹œλ₯Ό 거친 쑰회둜 μ—”ν‹°ν‹°μ˜ 동일성을 보μž₯함

 

2. νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° 지연

  • μ˜μ†μ„± μ»¨νƒμŠ€νŠΈμ—μ„œλŠ” μž‘μ„±λœ 쿼리λ₯Ό [μ“°κΈ° 지연 SQL 버퍼]에 쿼리λ₯Ό λ‹΄μ•„λ’€λ‹€κ°€, μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ˜ λͺ…령에 따라 DB에 μ „μ†‘λœλ‹€.
  • 객체가 μ˜μ†μ„± ν„΄ν…μŠ€νŠΈμ— μ˜μ†λ˜λ©΄, 1μ°¨ μΊμ‹œλ‘œ λ“€μ–΄κ°€κ³  μΏΌλ¦¬λŠ” SQL버퍼에 넣어진닀.
  • 이후 Transection을 Commit ν•˜κ±°λ‚˜, μ»¨ν…μŠ€νŠΈμ— 버퍼λ₯Ό λΉ„μš°λ„λ‘ λͺ…λ Ήν•˜λ©΄(flush) κ·Έλ•Œ λ²„νΌμ˜ 쿼리가 μ‹€ν–‰λ˜μ–΄ DB에 μ „μ†‘λœλ‹€.
profile

Dev-Kyuu

@kyuu_ng

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!