JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 재고를 차감할 때 동시성 이슈로 인한 오차가 발생하지 않도록 만들기 - 2

JSCODE 박재성
JSCODE 박재성
2026-01-12
author
JSCODE 박재성
category
Redis
createdAt
Jan 12, 2026
series
비전공자도 이해할 수 있는 Redis 중급/실전
slug
prevent-concurrency-issues-in-stock-deduction-part-2
type
post
updatedAt
Jan 12, 2026 12:17 AM

✅ 원인 파악

이전 강의에서 실제 테스트를 해보니 원래 차감되어야 하는 개수보다 적게 차감이 됐다. 한 마디로 재고를 차감할 때 오차가 발생했다. 실제 서비스에서는 이런 문제가 절대 발생하면 안 된다. 이 문제를 해결하기 위해 문제의 원인을 살펴보자.
notion image
재고 차감 API에 요청을 보낸 사용자가 두 명 있다고 가정하자. 그런데 이 사용자들이 거의 동시에 요청을 보낸 것이다. DB가 들어온 요청을 하나씩 순서대로 처리하는 방식이 아닌, 병렬적으로 동시에 여러 요청을 처리할 수 있게끔 설계가 되어있다.
그래서 사용자 1이 보낸 요청을 처리하기 위해 (재고 조회 → 재고 차감)의 로직을 수행하는 동안, 사용자 2가 보낸 요청을 처리하기 위해 (재고 조회 → 재고 차감)의 로직을 병렬적으로 수행한다. 문제는 이 때 발생한다.
사용자 1이 재고를 차감하기 전에 현재 재고가 얼마나 있는 지 조회(10,000개)한다. 그러고 사용자 2도 거의 동시에 요청을 보냈기 때문에 현재 재고가 얼마나 있는 지 조회(10,000개)를 한다. 그런 뒤에 각각 사용자가 현재 재고를 기준으로 1씩 차감한 뒤에 DB에 반영한다. 하지만 각 사용자가 조회한 재고의 개수는 둘 다 10,000개이기 때문에, 두 사용자 전부 DB에 재고를 UPDATE 할 때 9,999개로 업데이트(UPDATE stocks SET quantity = 9999 WHERE id = 1)한다.
이로 인해 2명의 사용자가 재고 차감 API에 요청을 보냈기 때문에 재고가 9,998개가 돼야함에도 불구하고, 재고가 9,999개가 됐던 것이다.
 
이런 문제를 보고 ‘거의 동시에 요청을 보냈을 때 발생하는 문제’라고 해서 ‘동시성 이슈’라고 부른다.
 
 

✅ 해결책

notion image
이 문제를 해결하는 방법은 간단하다. 들어온 요청을 병렬적으로 처리하게 하지 말고, 하나씩 순서대로 처리하게 하면 된다. 즉, 첫 번째 사용자의 요청을 다 처리한 뒤에 두 번째 사용자의 요청을 처리하는 식으로 설계를 하는 것이다.
 
들어온 요청을 병렬적으로 처리하지 않고, 하나씩 순서대로 처리하게끔 만드는 방법에는 여러가지가 있는 데 그 중에서 Redis로 Lock을 구현하는 방식으로 해결해볼 것이다. 여기서 Lock이라 함은 특정 데이터에 대해 동시에 접근하지 못하도록 ‘잠금’을 거는 장치를 의미한다.
 
비유를 하자면, 한 화장실에 여러 명이 동시에 들어갈 수 없게 만드는 것과 같다. 누군가 화장실을 사용하고 있으면 문을 잠그고, 다른 사람들은 문이 열릴 때까지 밖에서 기다려야 한다. 화장실 사용이 끝나고 문을 열면 그 다음 사람이 들어갈 수 있다.
 
재고 차감도 마찬가지다. 어떤 사용자가 재고 차감 API 요청을 처리하고 있다면, 그 처리가 끝날 때까지 다른 사용자는 해당 재고 데이터에 접근하지 못하도록 막아야 한다. 이때 사용하는 ‘문 잠금 장치’ 역할을 하는 것이 바로 Redis의 Lock이다. 즉, Redis의 Lock은 여러 요청이 동시에 하나의 자원을 수정하려 할 때, 이를 순서대로 처리하도록 강제하는 장치이다.
 
 
다음 강의에서는 Redis로 Lock을 구현해 동시성 이슈를 해결해보자.
 
author
category
Redis
createdAt
Jan 12, 2026
series
비전공자도 이해할 수 있는 Redis 중급/실전
slug
type
series-footer
updatedAt
Jan 12, 2026 12:26 AM
📎
이 글은 비전공자도 이해할 수 있는 Redis 중급/실전 강의의 수업 자료 중 일부입니다.