본문으로 이동
문서

풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson

임우빈 · 컬리 · 컬리 기술 블로그

원본 보기

소개

어노테이션 기반으로 분산락을 사용하는 방법에 대해 소개합니다.

AI 핵심 요약

입고관리 시스템에서는 중복 요청과 여러 작업자의 동시 처리로 재고 차감이나 발주 등록의 정합성이 깨질 수 있어, 멀티 인스턴스 환경에서 공유할 분산락을 도입했습니다. 추가 인프라 없이 사용할 수 있는 Redis와 락 인터페이스, 타임아웃 설정, Pub/Sub 기반 획득 방식을 제공하는 Redisson을 선택했습니다. 비즈니스 로직과 락 처리를 분리하기 위해 Spring AOP와 어노테이션을 만들고, SpEL로 락 키를 지정하며 대기 시간과 임대 시간을 조정할 수 있게 했습니다. 별도 트랜잭션을 커밋한 뒤 락을 해제하도록 구성했으며, 쿠폰 차감과 중복 발주 테스트를 통해 락이 동시성 문제를 막는 효과를 확인했습니다.

  • Lettuce의 SETNX 기반 락은 재시도와 타임아웃을 직접 구현해야 하고, 폴링이 잦으면 Redis 부하가 커질 수 있습니다.
  • Redisson의 Pub/Sub 방식은 락 해제 신호를 받은 클라이언트가 획득을 시도하도록 해 스핀락 방식의 반복 요청을 줄입니다.
  • SpEL로 메서드 인자에서 락 키를 구성하면 쿠폰 ID나 발주 코드처럼 업무 단위에 맞춰 락 범위를 정할 수 있습니다.
  • 락을 기다리는 시간과 임대 시간은 작업 특성에 맞게 설정하고, 임대 시간이 작업보다 짧으면 락이 먼저 풀릴 수 있음을 고려해야 합니다.
  • 락을 해제하기 전에 트랜잭션이 커밋되도록 구성해야 다음 요청이 커밋 전 데이터를 읽어 정합성이 깨지는 상황을 막을 수 있습니다.