<aside>
👨💻 Redis를 이용한 분산락을 적용하는 것이 서버에 효과가 있을까? 이전에 사용했던 synchronized
블록과 현재 Redis를 이용한 분산락의 차이점과 각각의 장단점을 비교해보자.
</aside>
synchronized
블록기존 코드에서는 synchronized
블록을 사용하여 스레드 간의 동시성을 제어하고 있었다. synchronized
블록은 한 JVM 내에서만 작동하며, 같은 인스턴스를 사용하는 여러 스레드가 동시에 접근하는 것을 막는다. 하지만 이 방법에는 몇 가지 한계가 있다:
synchronized
는 단일 JVM에서만 작동하므로, 분산 환경(여러 대의 서버가 쿠폰 발급 서비스를 제공하는 경우)에서는 효과가 없다.public void issueRequestV1(CouponIssueRequestDto requestDto) {
// 동시성 제어를 위한 lock
synchronized (this) {
couponIssueService.issue(requestDto.couponId(), requestDto.userId());
}
log.info("쿠폰 발급 완료. couponId: %s, userId: %s".formatted(requestDto.couponId(), requestDto.userId()));
}
Redis를 이용한 분산락을 사용하면 여러 대의 서버(분산 환경)에서도 락을 획득하고 해제하는 것을 관리할 수 있다. RedissonClient
를 사용한 예제는 다음과 같은 장점을 제공한다: