2024. 10. 22. 18:46ㆍSpring 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 |