분산 락 구현을 위한 다양한 방법 비교
1. Redis (SETNX) - 메모리 기반
Redis는 기본적으로 SETNX 명령을 통해 분산 락을 제공하며, 락 획득과 TTL 을 설정하는 방식으로 간단하게 락 관리를 구현할 수 있습니다. 그러나 Redis의 기본 락 기능은 단일 노드에 의존하기 때문에 Redis 서버가 장애가 발생하거나 락이 제대로 해제되지 않을 경우, 데드락(deadlock) 상황이 발생할 수 있습니다.

2. 데이터베이스 - 디스크 기반
데이터베이스 락은 행 레벨 락이나 트랜잭션 락을 통해 분산 락을 구현할 수 있습니다. 별도의 기술 도입 없이 데이터베이스의 기본 기능을 활용할 수 있다는 장점이 있습니다.
- 비관적 락(Pessimistic Lock): 자원에 접근할 때, 항상 충돌이 발생할 것이라고 가정하고, 자원을 수정하기 전 락을 먼저 획득합니다.
하지만, 대규모 요청으로 락을 획득하는 경쟁이 많아질수록 응답 시간이 길어지고, 처리량이 줄어들게 됩니다.
- 낙관적 락(Optimistic Lock): 자원에 접근할 때, 충돌이 드물 것이라고 가정하고, 자원을 수정하기 전 락을 걸지 않고 먼저 작업을 수행합니다.
하지만, 충돌 빈도가 높아지면 롤백이 자주 발생하게 되며, 롤백은 단순히 트랜잭션을 취소하는 것이 아니라, 이미 진행된 모든 작업을 원상복구해야 하므로 추가적인 리소스가 소모됩니다.

3. Redisson - 메모리 기반
Redisson은 데이터를 메모리(RAM)에 저장하여, 디스크 I/O에 비해 훨씬 빠르게 락을 획득하고 해제할 수 있습니다. 분산 환경에서 인스턴스가 증가해도 Redis 클러스터를 통해 쉽게 확장할 수 있습니다.
- 자동 TTL 및 락 해제: Redisson은 TTL을 설정해 자동으로 락이 만료되도록 하여, 데드락 방지를 보장합니다.
- Pub/Sub 기반 효율적 대기: 락을 획득하지 못한 클라이언트는 Pub/Sub 메커니즘을 통해 락 해제 시점을 알림받고 효율적으로 락을 획득
- 확장성: Redis의 클러스터링을 통해 확장 가능한 시스템을 지원하며, 분산 환경에서 수십 개 이상의 인스턴스가 동시에 락을 관리할 수 있습니다.

3. 최종 결론
저희 프로젝트는 MSA 를 사용하고 있어, 대용량 트래픽을 처리할 수 있어야 했습니다. 단일 노드 환경이지만, 효율적인 락 관리와 성능을 유지하기 위해 안정적인 분산 락 관리 기술이 필요했습니다.
또한, 데이터베이스 락은 성능 저하와 확장성 부족 문제로 인해, Redis 기반의 Redisson을 선택하게 되었습니다.