Race Condition 3

계약하기 버튼, 두 번 누르면 어떻게 될까 ㅡ 비관적 락 적용기

필자는 현재 스마트폰 역경매 플랫폼 bidr(비더)를 개발 중이다. (5월 런칭 목표) bidr에서 계약이 만들어지는 흐름은 이렇다. 구매자가 견적을 올리면 여러 판매자가 입찰을 넣고, 구매자가 마음에 드는 입찰을 선택하면 계약이 체결된다. 간단한 구조다. 문제 인식 — 이 패턴, 어디서 많이 봤는데과거에 이커머스 프로젝트 개발 중 재고 차감 기능을 구현한 적이 있다. 여러 사용자가 동시에 같은 상품을 주문할 때 재고가 0 아래로 내려가는 걸 막아야 하는 상황이었다. 그때 낙관적 락과 Redis 분산락을 직접 써보면서 동시성 문제를 어떻게 다루는지 익히게 되었다. 그 경험이 있어서인지, bidr에서 계약 생성 기능을 구현하다가 코드를 보는데 뭔가 익숙하고 찝찝한(?) 느낌이 드는것이었다..! '구매자가 ..

Project/phonebid 2026.04.29

[프로젝트/기술적 의사결정] Redis 분산락으로 재고 감소 동시성 이슈 해결하기 (1/2)

필자는 MSA 기반 이커머스 프로젝트에서 상품/재고/예약구매 도메인을 맡아 진행중이다. 지난 프로젝트에서 쿠폰 도메인을 맡아 개발했을 때 Race condition 문제를 예상치 못하게 겪고 (..) 이번 프로젝트에서 상품/재고 도메인을 맡았을 땐 어느 정도 동시성 이슈가 생기리라고 예상을 했었다. 그래서 이번 포스팅에선 해당 이슈가 왜 발생하는지 원인을 분석하고, 문제를 해결하기 위한 방법과 그에 따른 기술적 의사결정 과정을 적어보려 한다. 문제 상황 바로 테스트 코드를 작성해보자.동시에 100개의 요청이 들어올 때의 테스트 코드를 작성하고 돌려보니 역시나 실패다. 실패하는 이유는 역시나 위에 언급해 둔 Race condition 문제 때문이다. 💡Race Condition 이란?두 개 이상의 스..

[트러블슈팅] '선착순 쿠폰 발급' 로직 - 동시성 문제 발생 (w/ Race Condition) (1/2)

일반 쿠폰 발급 로직 설계를 마치고, 선착순 쿠폰 발급 로직 개발에 들어왔다가 동시성 문제에 맞닥뜨렸다. 드디어 여태 들어만 봤던 동시성 문제를 해결할 기회가 왔다. 맞다이로 드루와 개요일단 서비스 및 컨트롤러, 레포 코드를 작성한 후 테스트 케이스를 작성하고 돌려봤을 땐 pass가 떴다. 그 후 postman으로 1차 기능 테스트 까지는 성공.서비스 레이어 코드123456789101112131415161718192021222324252627282930    /**     * 선착순 쿠폰 발급     */    @Transactional    public CouponIssuedResponseDto issueFirstComeCoupon(CouponIssuedRequestDto request) {      ..