서비스를 개발하다 보면 예상하지 못한 문제가 종종 발생하곤 합니다. 저도 그런 경험을 한 적이 있습니다. 물론 직접적으로 문제가 된 코드를 작성한 건 아니었지만 문제가 발생한 뒤 로직을 함께 분석하고 이야기하는 과정에 참여하면서 많은 걸 배웠습니다.당시에는 선물권을 지급하고 사용하는 기능이 있었는데 어느 날 이 기능에서 동시성 문제로 인해 선물권이 중복으로 사용되는 현상이 발생했고 결과적으로 3천만 원의 손해로 이어진 일이 있었습니다. 이번 글에서는 그때 어떤 상황이 있었고 문제를 어떻게 파악하고 해결했는지를 정리해보려고 합니다.문제 상황은 이러했습니다. 선물권은 보통 아래와 같은 상태값을 가지고 있었습니다.S0: 아직 사용되지 않은 상태S1: 처리 중S2: 사용 완료S3: 만료 또는 실패이 상태값을 기..