목록 보기
SSG 자동화센터 운영시스템에서 분산 락을 사용하는 방법
백엔드

SSG 자동화센터 운영시스템에서 분산 락을 사용하는 방법

SSG.COM
SSG.COM
2025년 2월 25일

두줄요약

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 설정
  • 재시도 정책과 함께 애노테이션 기반으로 재사용

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...