SeouliteLab

[JPA] 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock) 본문

프로그래밍

[JPA] 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

Seoulite Lab 2024. 2. 27. 17:04

JPA(Java Persistence API)에서는 동시에 여러 사용자가 데이터를 읽고 수정하는 상황에서 데이터 일관성을 유지하기 위해 락(Lock)을 사용한다. 이때 주로 사용되는 락의 종류에는 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)이 있다.

낙관적 락 (Optimistic Lock):

  • 낙관적 락은 데이터를 읽을 때 락을 획득하지 않고, 데이터를 수정할 때 충돌을 감지하는 방식이다.
  • JPA에서는 버전(Version) 정보를 사용하여 낙관적 락을 구현한다. 버전 필드는 엔티티 클래스에 추가되어야 하며, @Version 어노테이션을 사용하여 지정된다.
@Entity
public class Product {
    @Id
    private Long id;

    @Version
    private int version;
    
    // 다른 필드 및 메서드 생략
}

 

비관적 락 (Pessimistic Lock):

  • 비관적 락은 데이터를 읽을 때 미리 락을 획득하여 다른 사용자가 데이터를 수정하는 것을 막는 방식이다.
  • JPA에서는 EntityManager의 find 또는 query 메서드를 호출할 때 LockModeType을 설정하여 비관적 락을 적용할 수 있다.
Product product = entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);

 

낙관적 락과 비관적 락은 각각의 상황에 따라 적절하게 선택하여 사용해야 한다. 낙관적 락은 충돌이 적은 환경에서 성능을 향상시키는 데 유용하며, 비관적 락은 데이터의 일관성을 유지해야 하는 환경에서 사용된다.