락(Lock)이란 무엇인가?
락은 여러 사용자나 프로세스가 동시에 같은 데이터에 접근할 때, 데이터의 일관성과 무결성을 보호하기 위한 메커니즘입니다. 마치 여러 사람이 동시에 같은 문서를 수정하지 못하도록 하는 것과 비슷합니다.
결론부터 말씀드리면 비관적 락이 조금 더 강한 lock 같은 느낌!
비관적 락(Pessimistic Lock)
"다른 트랜잭션이 내 데이터를 변경할 것이다" 라고 가정하는 방식
특징
- 데이터를 읽는 시점에 즉시 락을 획득합니다
- 트랜잭션이 완료될 때까지 다른 트랜잭션은 해당 데이터에 접근할 수 없습니다
- 동시 접근이 많은 환경에서 대기 시간이 길어질 수 있습니다
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT p FROM Product p WHERE p.id = :id")
Product findByIdWithPessimisticLock(@Param("id") Long id);
사용 상황
- 실시간 재고 관리 시스템
- 금융 거래 처리
- 경쟁이 심한 데이터 수정이 예상되는 경우
낙관적 락(Optimistic Lock)
"충돌이 거의 발생하지 않을 것이다" 라고 가정하는 방식
특징
- 데이터를 읽을 때는 락을 걸지 않습니다
- 데이터 수정 시점에 충돌을 검사합니다 (주로 버전 필드 사용)
- 충돌이 발견되면 예외를 발생시키고 재시도하도록 합니다
@Entity
public class Product {
@Id
private Long id;
private String name;
private int stock;
@Version
private Long version;
}
사용 상황
- 읽기 작업이 많은 환경
- 충돌 가능성이 낮은 경우
- 사용자 프로필 수정 같은 덜 빈번한 업데이트
장단점 )
결론 ))
- 기본적으로는 @Version을 사용하는 낙관적 락을 먼저 고려하는 것이 일반적
- 하지만 실제 운영하면서 충돌이 너무 많이 발생하면 비관적 락으로 전환
- 즉, "낙관적 락을 기본으로 사용하고, 필요하면 비관적 락을 적용"하는 것이 일반적인 전략
👉 실제 프로젝트에서도 기본적으로 낙관적 락을 사용하고, 충돌이 많아지면 비관적 락으로 바꾸는 경우가 많다!
'TIL' 카테고리의 다른 글
sql injection / XSS 예방법 (0) | 2025.03.19 |
---|---|
spring servlet 정리. (1) | 2025.03.17 |
ec2 내 서버 무중단으로 실행시키기 (0) | 2025.03.16 |
GitHub action SSH key 발급 (0) | 2025.03.15 |
NginX 설정 https 요청시 주의점 (0) | 2025.03.14 |