πŸ” 낙관적 락 vs 비관적 락

도두맨·2025λ…„ 7μ›” 9일

곡뢀

λͺ©λ‘ 보기
23/23

우주의 낙관적인 락, 비관적인 락을 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

쿠폰 쀑볡 λ°œκΈ‰? 재고 κΌ¬μž„? πŸ”„
μ‹€λ¬΄μ—μ„œ 자주 λ§ˆμ£ΌμΉ˜λŠ” λ™μ‹œμ„± 문제, Lock을 μ œλŒ€λ‘œ μ•Œλ©΄ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€!


βœ… 1. 락(Lock)μ΄λž€?

  • μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ λ°œμƒν•˜λŠ” μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” μž₯치
  • DB의 **μ •ν•©μ„±(Data Consistency)**을 μ§€ν‚€λŠ” 핡심 λ©”μ»€λ‹ˆμ¦˜

예: λ™μ‹œμ— 쿠폰을 λ°›μœΌλ €λŠ” 20λͺ…μ˜ μœ μ €κ°€ μžˆμ„ λ•Œ, μ‹€μ œ μ§€κΈ‰ μˆ˜λŸ‰μ€ 5λͺ…λ§Œ κ°€λŠ₯ν•΄μ•Ό 함!


βœ… 2. 낙관적 락 (Optimistic Lock)

"문제 없을 거라 μƒκ°ν•˜κ³  λ¨Όμ € μ§„ν–‰"

  • 버전 ν•„λ“œλ₯Ό μ΄μš©ν•΄ 데이터가 λ³€κ²½λ˜μ—ˆλŠ”μ§€ 확인
  • JPAμ—μ„œλŠ” @Version으둜 μ‚¬μš© κ°€λŠ₯
@Version
private Long version;
  • νŠΈλžœμž­μ…˜ μ’…λ£Œ μ‹œμ μ— 버전 값이 λ‹€λ₯΄λ©΄ OptimisticLockException λ°œμƒ

βœ” μž₯점

  • λ³„λ„μ˜ DB 락을 μž‘μ§€ μ•Šμ•„ μ„±λŠ₯에 유리
  • 읽기 쀑심 νŠΈλž˜ν”½μ—μ„œ 유리

❌ 단점

  • 좩돌이 λΉˆλ²ˆν•  경우 계속 μ‹€νŒ¨ β†’ μž¬μ‹œλ„ 증가

βœ… 3. 비관적 락 (Pessimistic Lock)

"μ–Έμ œλ“  좩돌이 λ‚  수 μžˆμ–΄! 미리 μž κ°€λ‘μž"

  • 데이터λ₯Ό μ‘°νšŒν•  λ•ŒλΆ€ν„° 락을 건닀 β†’ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ λŒ€κΈ°
  • JPAμ—μ„œ λ‹€μŒκ³Ό 같이 μ‚¬μš©
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT p FROM Product p WHERE p.id = :id")
Optional<Product> findByIdForUpdate(@Param("id") Long id);
  • λ‚΄λΆ€μ μœΌλ‘œ SELECT ... FOR UPDATE μ‹€ν–‰

βœ” μž₯점

  • 데이터 μ •ν•©μ„± μ² μ €νžˆ 보μž₯

❌ 단점

  • μ„±λŠ₯ μ €ν•˜ 우렀
  • λ°λ“œλ½ μœ„ν—˜ 쑴재

βœ… 4. μ˜ˆμ‹œλ‘œ 비ꡐ해보기

μƒν™©μ ν•©ν•œ 락 λ°©μ‹μ΄μœ 
쿠폰 μ„ μ°©μˆœ λ°œκΈ‰λ‚™κ΄€μ  λ½μ‹€νŒ¨ν•΄λ„ μž¬μ‹œλ„ κ°€λŠ₯ν•˜κ³  속도가 μ€‘μš”
재고 차감 / κ³„μ’Œ 이체비관적 락단 1건의 μ‹€νŒ¨λ„ ν—ˆμš©λ˜μ§€ μ•ŠμŒ

βœ… 5. 마무리 정리

  • 락은 DB μ •ν•©μ„±κ³Ό νŠΈλžœμž­μ…˜ μ•ˆμ „μ„±μ„ μœ„ν•œ 도ꡬ

  • μ–΄λ–€ 락을 μ“Έμ§€λŠ” 상황에 따라 λ‹€λ₯΄λ©°,

    • πŸ’¨ μ„±λŠ₯이 μ€‘μš”ν•˜λ‹€λ©΄ β†’ 낙관적 락
    • πŸ” 정확성이 μ΅œμš°μ„ μ΄λΌλ©΄ β†’ 비관적 락

0개의 λŒ“κΈ€