
백엔드
SSG 자동화센터 운영시스템에서 분산 락을 사용하는 방법
두줄요약
Redis 분산 락과 스프링 AOP로 입하 확정 처리 API의 동시성 이슈를 해결했습니다. 또한 @Transactional과의 실행 순서 문제와 커넥션 사용 이슈를 @Order로 정리했습니다.
문제 상황
- 입하 확정 처리 API에서 간헐적 400/500 에러 발생
- 기존 동시성 제어 테이블의 SELECT-INSERT 방식에서 조회 시점 경쟁으로 무결성 제약조건 위반 가능
- 여러 테이블 UPDATE/INSERT/DELETE와 프로시저 호출이 섞인 복잡한 작업 구조
원인 분석
- 다중 서버 인스턴스 환경에서 공통 락 필요
- DB 락은 데드락 위험과 성능 저하 우려
- 낙관적 락은 버전 비교·예외 처리·재처리 로직 구현 부담, 혼재된 작업 구조에 빠른 적용 어려움
해결 방법
- Redis 분산 락으로 동시성 제어 방식 전환
- Lettuce의 스핀 락보다 Pub/Sub 기반 Redisson 선택
- 스프링 AOP와 @DistributedLock 애노테이션으로 락 로직 모듈화
주의할 점
- @Transactional과 분산 락 AOP 동작 순서에 따라 락 해제 시점이 달라질 수 있음
- 트랜잭션보다 락이 먼저 풀리면 동시성 문제가 재발할 수 있음
- 트랜잭션용 커넥션을 두 번 쓰지 않도록 Advisor 순서 제어 필요
적용해볼 점
- @Order로 분산 락 AOP를 @Transactional보다 먼저 실행
- finally에서 락 해제, leaseTime으로 TTL 설정
- 재시도 정책과 함께 애노테이션 기반으로 재사용
