주니어 백엔드 개발자가 반드시 알아야 할 실무 지식 - 6장 동시성, 데이터가 꼬이기 전에 잡아야 한다
동시성 문제는 멀티스레드 문법 문제로만 이해하면 부족하다.
실무에서 동시성은 대부분 “같은 데이터를 여러 요청이 동시에 건드릴 때 어떤 결과가 만들어지는가”의 문제다.
자주 만나는 동시성 문제
- Lost Update
- Double Spending
- 중복 처리
- 재고 음수
- 상태 전이 꼬임
- 순서 역전
왜 위험한가
테스트 환경에서는 잘 재현되지 않기 때문이다.
- 로컬은 요청량이 적고
- 데이터가 단순하고
- 타이밍이 잘 겹치지 않는다
하지만 운영에서는 동시에 수십, 수백 건이 들어오면서 문제를 드러낸다.
해결 관점
1. 비관적 락
SELECT ... FOR UPDATE- 명시적 row lock
정합성은 강하지만 경합이 심해지면 성능이 떨어진다.
2. 낙관적 락
- version column
- compare-and-swap
충돌이 적은 환경에서 유리하다.
3. 유니크 제약
애플리케이션 로직보다 DB 제약이 더 강력한 경우가 많다.
예:
- 중복 주문 방지 키
- 중복 발급 방지
4. 멱등성 키
특히 외부 연동/재시도 환경에서는 매우 중요하다.
주니어가 기억해야 할 것
- 동시성은 코드 블록 하나의 문제가 아니다
- DB 트랜잭션, 락, 상태 모델과 같이 봐야 한다
- “이 요청이 동시에 두 번 들어오면 어떻게 되는가?”를 항상 물어봐야 한다
- 정합성 비용과 성능 비용은 트레이드오프다
정리
동시성은 고급 주제가 아니라 실무 기본기다.
결제, 재고, 예약, 상태 변경처럼 핵심 도메인을 다루는 순간 반드시 마주친다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
댓글
아직 댓글이 없습니다