JPA - πŸš€ StaleObjectStateException 이 λ°œμƒν•œλ‹€λ©΄

StaleObjectStateException 은 Hibernate μ—μ„œ λ™μ‹œμ— 같은 μ—”ν‹°ν‹°λ₯Ό μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” λ™μ‹œμ„± 좩돌 λ¬Έμ œμž…λ‹ˆλ‹€.

즉, A νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό μˆ˜μ •ν•˜λŠ” λ™μ•ˆ, B νŠΈλžœμž­μ…˜μ΄ 같은 데이터λ₯Ό μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ 좩돌이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” λ°œμƒ 상황

βœ… 1. Optimistic Locking

  • @Version ν•„λ“œλ₯Ό κ°€μ§„ μ—”ν‹°ν‹°λ₯Ό λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ λ™μ‹œμ— μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ λ°œμƒ.

βœ”οΈ 예: μ‚¬μš©μžκ°€ 같은 데이터λ₯Ό λ™μ‹œμ— μˆ˜μ •ν•˜λŠ” 경우.

βœ… 2. Detached Entity 문제

  • findById() λ˜λŠ” findByUserId() λ“±μœΌλ‘œ μ‘°νšŒν•œ μ—”ν‹°ν‹°κ°€ Detached μƒνƒœμ—μ„œ μ—…λ°μ΄νŠΈλ  경우 λ°œμƒ.

  • JPAκ°€ κ΄€λ¦¬ν•˜λŠ” Persistence Context λ°–μ—μ„œ μˆ˜μ •λœ μ—”ν‹°ν‹°λ₯Ό save() 호좜 μ‹œ merge() κ³Όμ •μ—μ„œ 좩돌 λ°œμƒ.

βœ… 3. Long-running Transactions (κΈ΄ νŠΈλžœμž­μ…˜)

같은 데이터λ₯Ό μ˜€λž«λ™μ•ˆ μˆ˜μ •ν•˜λŠ” νŠΈλžœμž­μ…˜μ΄ μžˆμ„ λ•Œ, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 변경이 λ°œμƒν•˜λ©΄ μ˜ˆμ™Έ λ°œμƒ.

βœ… 4. 닀쀑 μš”μ²­ 처리 (Concurrency Issues)

두 개 μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ΄ 거의 λ™μ‹œμ— 같은 데이터λ₯Ό μˆ˜μ •ν•˜λ©΄ StaleObjectStateException이 λ°œμƒ κ°€λŠ₯.


πŸ₯² μœ„μ˜ μ˜ˆμ‹œ 쀑에 λ‚΄κ°€ κ²ͺμ—ˆλ˜ 것은 [2. Detached Entity] 문제..

ING

Last updated