Post

[JPA] Dirty Checking

[JPA] Dirty Checking

πŸ“Œ Dirty Checkingμ΄λž€?

Dirty Checking(λ³€κ²½ 감지)λž€ JPAκ°€ μ˜μ† μƒνƒœμΈ μ—”ν‹°ν‹°μ˜ 값이 λ°”λ€Œμ—ˆλŠ”μ§€λ₯Ό μžλ™μœΌλ‘œ 감지해, νŠΈλžœμž­μ…˜μ„Β flushν•˜λŠ” μˆœκ°„ ν•„μš”ν•œΒ UPDATE 쿼리λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” κΈ°λŠ₯이닀. λ”°λ‘œ save λ˜λŠ” saveAndFlush λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ νŠΈλžœμž­μ…˜μ΄ 끝날 λ•Œ μžλ™μœΌλ‘œ μ—”ν‹°ν‹° λ³€κ²½ λ‚΄μš©μ΄ DB에 λ°˜μ˜λœλ‹€.

μ€€μ˜μ† λ˜λŠ” λΉ„μ˜μ† μ—”ν‹°ν‹°λŠ” Dirty Checking λŒ€μƒμ΄ μ•„λ‹ˆλ‹€. 즉, 이듀은 νŠΈλžœμž­μ…˜μ΄ λλ‚˜λ„ λ³€κ²½ λ‚΄μš©μ΄ DB에 μžλ™μœΌλ‘œ λ°˜μ˜λ˜μ§€ μ•ŠλŠ”λ‹€.

πŸ“Œ λ™μž‘ κ³Όμ •

persist , find λ©”μ„œλ“œ λ“±μœΌλ‘œ μ—”ν‹°ν‹°κ°€ μ˜μ† μƒνƒœκ°€ 되면, μ‹€μ œ μ—”ν‹°ν‹° κ°μ²΄λŠ” 1μ°¨ μΊμ‹œμ— μ €μž₯되고, μ—”ν‹°ν‹°μ˜ μŠ€λƒ…μƒ· λ˜ν•œ ν•¨κ»˜ λ³΄κ΄€λœλ‹€.

νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ—”ν‹°ν‹°μ˜ ν•„λ“œλ₯Ό μˆ˜μ •ν•΄λ„ μ¦‰μ‹œ 쿼리문이 DB에 λ‚ λΌκ°€λŠ” 것이 μ•„λ‹ˆλ‹€. λ³€κ²½ λ‚΄μš©μ€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—λ§Œ λ°˜μ˜λœλ‹€.

νŠΈλžœμž­μ…˜μ΄ μ»€λ°‹λ˜λ©΄ flush κ°€ 호좜되게 λ˜λŠ”λ°, JPAλŠ” flush μ‹œμ μ—μ„œ 1μ°¨ μΊμ‹œμ˜ μŠ€λƒ…μƒ·κ³Ό μ—”ν‹°ν‹°λ₯Ό ν•„λ“œλ³„λ‘œ λΉ„κ΅ν•˜μ—¬ 달라진 점이 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. λ§Œμ•½ μžˆλ‹€λ©΄, μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ— UPDATE 쿼리λ₯Ό μƒμ„±ν•˜μ—¬ λ„£λŠ”λ‹€.

flush λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œ μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ˜ 쿼리λ₯Ό DB에 μ „μ†‘ν•˜κ³ , μ‹€μ œ νŠΈλžœμž­μ…˜ 컀밋이 μΌμ–΄λ‚˜λ©΄μ„œ λ³€κ²½ 사항에 DB에 반영되게 λœλ‹€.

πŸ“Œ νŠΉμ§•

μƒμ„±λ˜λŠ” UPDATE μΏΌλ¦¬λŠ” λ³€κ²½λœ ν•„λ“œκ°€ μ•„λ‹ˆλΌ λͺ¨λ“  ν•„λ“œκ°€ ν¬ν•¨λœ 쿼리이닀. λ³€κ²½λœ ν•„λ“œκ°€ 맞좰 쿼리λ₯Ό νŒŒμ‹±ν•˜λŠ” λΉ„μš©λ³΄λ‹€ λͺ¨λ“  ν•„λ“œλ₯Ό μ „μ†‘ν•˜λ„λ‘ ν•˜λŠ” λ°©λ²•μ˜ λΉ„μš©μ΄ 더 적을 수 있으며, 항상 같은 쿼리λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 쿼리λ₯Ό μΊμ‹œν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

λ‹€λ§Œ μ—”ν‹°ν‹°μ˜ μŠ€λƒ…μƒ·μ„ λ©”λͺ¨λ¦¬μ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ—, μ—”ν‹°ν‹°μ˜ μˆ˜κ°€ λ§Žκ±°λ‚˜ ν•„λ“œκ°€ λ§Žλ‹€λ©΄ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•˜κ²Œ λœλ‹€. λ˜ν•œ flush μ‹œμ μ—μ„œ μ˜μ† μ—”ν‹°ν‹°μ˜ ν•„λ“œ κ°’ 비ꡐ μ‹œ λΉ„μš©λ„ μ¦κ°€ν•œλ‹€. κΉ€μ˜ν•œ λ‹˜μ˜ β€˜μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ°β€™μ— μ˜ν•˜λ©΄, ν•„λ“œκ°€ 30κ°œκ°€ λ„˜μ–΄κ°€λ©΄ 전체 ν•„λ“œ UPDATE 쿼리문의 μž₯점이 ν‡΄μƒ‰λœλ‹€κ³  ν•œλ‹€.

이 경우, @DynamicUpdate λ₯Ό μ‚¬μš©ν•˜λ©° μˆ˜μ •λœ ν•„λ“œμ— λŒ€ν•΄μ„œλ§Œ UPDATE 쿼리λ₯Ό μƒμ„±ν•˜λ„λ‘ ν•  수 μžˆλ‹€. λ‹€λ§Œ, ν•„λ“œκ°€ 30κ°œκ°€ λ„˜μ–΄κ°€λŠ” 상황이라면 ν…Œμ΄λΈ” 섀계λ₯Ό λ‹€μ‹œ μ‚΄νŽ΄ λ³Ό ν•„μš”κ°€ μžˆλ‹€.

λ˜λŠ” νŠΉμ • ν•„λ“œλ§Œ μ—…λ°μ΄νŠΈν•˜λŠ” JPQL 쿼리λ₯Ό μž‘μ„±ν•˜λŠ” 방법도 μžˆλ‹€. λ‹€λ§Œ 이 방법은 DB와 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ κ°„ λΆˆμΌμΉ˜ν•˜λŠ” 상황이 λ°œμƒν•  수 μžˆλ‹€. JPQL μΏΌλ¦¬λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό κ±°μΉ˜μ§€ μ•Šκ³  λ°”λ‘œ DB에 쿼리λ₯Ό μ „μ†‘ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ§Œμ•½ 읽기 μ „μš© νŠΈλžœμž­μ…˜μ΄λΌλ©΄, @Transaction(readOnly = true) λ₯Ό 톡해 Dirty Checking을 μƒλž΅ν•  수 μžˆλ‹€.

πŸ“Œ μ°Έκ³ 

https://jojoldu.tistory.com/415

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