이전 강의에서 실제 테스트를 해보니 원래 차감되어야 하는 개수보다 적게 차감이 됐다. 한 마디로 재고를 차감할 때 오차가 발생했다. 실제 서비스에서는 이런 문제가 절대 발생하면 안 된다. 이 문제를 해결하기 위해 문제의 원인을 살펴보자.
재고 차감 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개가 됐던 것이다.
이런 문제를 보고 ‘거의 동시에 요청을 보냈을 때 발생하는 문제’라고 해서 ‘동시성 이슈’라고 부른다.
✅ 해결책
이 문제를 해결하는 방법은 간단하다. 들어온 요청을 병렬적으로 처리하게 하지 말고, 하나씩 순서대로 처리하게 하면 된다. 즉, 첫 번째 사용자의 요청을 다 처리한 뒤에 두 번째 사용자의 요청을 처리하는 식으로 설계를 하는 것이다.
들어온 요청을 병렬적으로 처리하지 않고, 하나씩 순서대로 처리하게끔 만드는 방법에는 여러가지가 있는 데 그 중에서 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 중급/실전 강의의 수업 자료 중 일부입니다.