Locking

2024. 10. 22. 18:46Spring Boot/Spring Data JPA

Locking은 데이터베이스에서 동시성을 관리하는 중요한 메커니즘으로, 여러 트랜잭션이 데이터에 접근할 때 데이터 무결성을 보장하기 위해 사용됩니다. Spring Data JPA에서는 @Lock 어노테이션을 사용하여 쿼리 메서드나 CRUD 메서드에 잠금 모드를 지정할 수 있습니다. 아래에서 이를 자세히 설명하겠습니다.

1. 쿼리 메서드에서 Lock 모드 정의하기

쿼리 메서드에 @Lock 어노테이션을 사용하여 사용할 잠금 모드를 지정할 수 있습니다. 예를 들어, LockModeType.READ를 사용하면 해당 쿼리가 읽기 전용 잠금으로 실행됩니다. 이렇게 하면 다른 트랜잭션에서 동일한 데이터에 대한 변경 작업을 할 수 없게 되어, 데이터 무결성이 유지됩니다.

예시 1: 쿼리 메서드에서 Lock 메타데이터 정의하기

interface UserRepository extends Repository<User, Long> {

    // 일반 쿼리 메서드
    @Lock(LockModeType.READ)
    List<User> findByLastname(String lastname);
}

위의 코드에서 findByLastname 메서드는 LockModeType.READ 잠금을 사용하도록 설정되었습니다. 이 메서드가 호출되면 해당 쿼리는 읽기 잠금을 설정하고, 다른 트랜잭션에서 해당 사용자 정보를 변경하는 것을 방지합니다.

2. CRUD 메서드에서 Lock 모드 정의하기

CRUD 메서드에서도 잠금 메타데이터를 정의할 수 있습니다. 이를 위해 해당 메서드를 repository 인터페이스에서 재정의하고, @Lock 어노테이션을 추가합니다.

예시 2: CRUD 메서드에서 Lock 메타데이터 정의하기

interface UserRepository extends Repository<User, Long> {

    // CRUD 메서드의 재정의
    @Lock(LockModeType.READ)
    List<User> findAll();
}

위 코드에서는 findAll() 메서드를 재정의하면서 @Lock(LockModeType.READ)를 추가했습니다. 이를 통해 findAll() 메서드 호출 시 전체 사용자의 데이터를 읽을 때 읽기 잠금이 적용됩니다. 이 경우 다른 트랜잭션에서 사용자의 데이터에 대한 수정이 불가능해지므로, 데이터의 일관성을 보장할 수 있습니다.

LockModeType의 종류

Spring Data JPA에서 사용할 수 있는 LockModeType의 종류는 다음과 같습니다:

  • LockModeType.READ: 읽기 잠금으로, 다른 트랜잭션에서 수정할 수 없게 합니다.
  • LockModeType.WRITE: 쓰기 잠금으로, 해당 데이터에 대한 모든 접근을 차단합니다.
  • LockModeType.OPTIMISTIC: 낙관적 잠금으로, 데이터 변경 시점에 버전 체크를 통해 충돌을 감지합니다.
  • LockModeType.OPTIMISTIC_FORCE_INCREMENT: 낙관적 잠금이며, 항상 버전 번호를 증가시킵니다.
  • LockModeType.PESSIMISTIC_READ: 비관적 읽기 잠금으로, 다른 트랜잭션에서 해당 데이터를 수정할 수 없게 합니다.
  • LockModeType.PESSIMISTIC_WRITE: 비관적 쓰기 잠금으로, 다른 트랜잭션에서 해당 데이터를 읽거나 수정할 수 없게 합니다.

 

이처럼 Spring Data JPA의 @Lock 어노테이션을 통해 트랜잭션 내에서 데이터 접근에 대한 잠금을 설정할 수 있습니다. 이를 통해 여러 트랜잭션이 동시에 같은 데이터에 접근할 때 발생할 수 있는 문제를 예방하고, 데이터 무결성을 유지할 수 있습니다. 

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT  (0) 2024.10.22
PESSIMISTIC_READ, PESSIMISTIC_WRITE  (0) 2024.10.22
Transactionality  (0) 2024.10.22
Projections  (0) 2024.10.22
Scrolling  (0) 2024.10.20