본문으로 이동
컬리 공통 암호화 모듈의 동시성 이슈 해결하기
문서

컬리 공통 암호화 모듈의 동시성 이슈 해결하기

박준규 · 컬리 · 컬리 기술 블로그

원본 보기

소개

공통 모듈에서 발생한 동시성 이슈의 해결 과정을 소개합니다.

AI 핵심 요약

컬리의 공통 암호화 SDK에서 간헐적으로 `newPosition > limit` 오류가 발생해, 일부 고객의 전화번호가 빈칸으로 표시되는 문제가 생겼습니다. 원인을 추적한 결과 Caffeine 캐시에 저장된 AWS KMS Data Key의 `ByteBuffer`를 여러 스레드가 공유했고, `clear()`와 `get()`이 변경하는 position 상태가 서로 영향을 주는 동시성 문제였습니다. 고정 스레드 풀로 암호화 로직을 병렬 실행하고 버퍼 상태를 출력해 문제를 재현한 뒤, 성능 저하가 우려되는 `synchronized` 대신 `duplicate()`로 스레드별 버퍼를 사용하도록 바꿨습니다. 공유 버퍼는 여러 스레드에서 안전하지 않으므로, 상태를 변경하는 API의 thread-safety를 확인하고 독립된 버퍼를 제공해야 한다는 점을 보여줍니다.

  • ByteBuffer의 position과 limit은 버퍼 상태를 나타내며, 상대적 읽기 작업은 position을 변경한다.
  • 공유 객체의 메서드가 thread-safe한지 API 문서에서 확인하고, 여러 스레드가 접근할 때는 상태 변경 여부를 점검한다.
  • 동시성 문제를 재현할 때는 고정 스레드 풀로 요청을 병렬 실행하고 position·limit 같은 내부 상태를 기록한다.
  • 공유 버퍼를 동기화하면 성능 비용이 생길 수 있으므로, duplicate()나 asReadOnlyBuffer()로 스레드별 버퍼를 사용하는 방법을 검토한다.