포스트

주니어 백엔드 개발자가 반드시 알아야 할 실무 지식 - 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 라이센스를 따릅니다.

댓글

아직 댓글이 없습니다