[스프링] JPA와 락(Lock) 처리

이번 포스트에서는 Java Persistence API(JPA)에서의 락 처리에 대해 알아보겠습니다. 락은 동시에 여러 사용자가 동일한 데이터를 변경하는 것을 방지하기 위해 사용됩니다.

1. 락(Lock)이란?

은 데이터베이스에서 동시에 여러 사용자가 동일한 데이터를 접근하는 것을 제어하기 위한 메커니즘입니다. JPA에서는 두 가지 종류의 락을 지원합니다.

1.1 낙관적 락(Optimistic Lock)

낙관적 락은 데이터를 변경하기 전에 다른 사용자가 데이터를 변경하지 않을 것으로 가정하고, 실제 변경 시에 충돌이 발생할 경우 예외를 발생시키는 방식입니다. 모든 사용자가 동시에 데이터를 변경할 일이 없는 경우에 주로 사용됩니다.

1.2 비관적 락(Pessimistic Lock)

비관적 락은 데이터를 읽을 때 락을 걸어서 다른 사용자가 해당 데이터를 변경하지 못하도록 하는 방식입니다. 데이터를 읽는 시점부터 데이터를 변경할 때까지 락이 유지되기 때문에 다중 접속 환경에서 주로 사용됩니다.

2. JPA에서의 락 처리

JPA에서는 @Version 애노테이션을 통해 낙관적 락을 지원하고, LockModeType을 통해 비관적 락을 지원합니다.

2.1 낙관적 락(Optimistic Lock)

@Entity
public class Product {
    @Id
    private Long id;
    private String name;
    @Version
    private int version;
    // ...
}

위의 예시처럼 @Version 애노테이션을 사용하여 엔티티의 버전 관리를 할 수 있습니다.

2.2 비관적 락(Pessimistic Lock)

entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);

위의 예시처럼 LockModeType을 사용하여 해당 엔티티에 대한 비관적 락을 설정할 수 있습니다.

3. 마무리

이렇게 JPA를 통해 낙관적 락과 비관적 락을 사용하여 데이터의 일관성과 동시성을 보장할 수 있습니다. 애플리케이션의 요구사항과 데이터베이스의 특성에 맞게 적절한 락 전략을 선택하여 사용하는 것이 중요합니다.

참고문헌: JPA Specification

stackoverflow

자세한 내용은 참고 문헌을 확인해 주세요.