[Java] 동시요청에 대한 무결한 처리를 보장하는 방법 5(환경에 따른 방안 모색과 singleton 개선)

Hyo Kyun Lee·2025년 1월 9일
0

Java

목록 보기
71/87

1. 개요

채번테이블에서 가져온 pk중복오류 대응, 즉 동시성 제어로 활용한 싱글톤 방법은 알고보니 동시성 제어와 아무런 연관이 없었다.

물론 싱글톤을 활용한 동시성 제어 방법이 있을 수는 있겠지만, 11.003TPS 자체가 싱글톤으로 채번값을 유일인자로 확보하겠다는 나의 방법을 적용하기에 "운좋게" 적정한 수치였고, 트래픽이 더 높아진다면 꼼짝없이 다른 방법을 찾아야 했다.

여기서 얻은 영감과 통찰력을 기억하기 위해 본 글을 기록한다.

2. singleton은 동시성 제어 방법이 아니다.

결과적으로 singleton은 동시성 제어 방법이 아니다. 정확하게 말하면 그리 좋은 선택지는 아니다.

singleton은 멀티스레드 환경에서 비동기처리를 진행할때, 최초 접근 자원의 일관성을 유지하기 위해 사용할 수는 있다.

동시성 제어는 비동기처리와는 다른 개념이다. 애초에 단일 스레드 환경이기도 하고, 멀티스레드를 사용한다 하더라도 이는 하나의 자원을 위한 처리 방법이다. 내가 생각했던 자원은 사용자의 다수 접근 이에 따라 자원이 각각 다른 상태로 읽히는 것을 걱정하였는데 처음부터 잘못된 접근이었다.

또한 채번값과 같은 필드 변수보다는 처리하고자 하는 정보, 즉 dto를 싱글톤으로 접근하는 것이 맞다.

3. 접근 방법

가장 통상적인 방법은 db를 이용하는 방법이다. 그런데 멀티스레드 환경과 조합해서 rdbms에서 제공하는 동시성 제어 기능을 적절히 혼합해서 사용해야 한다.

  • 따닥이슈처럼 멀티스레드가 최초 자원 접근 시 동일한 상태여야 하는가
  • 주문처럼 한 건에 대한 데이터 정합성, 즉 한 트랜잭션의 멱등성이 보장되어야 하며 이를 사용자가 인지해야 하는가
  • 영화티켓처럼 사용자가 요청한 수정사항과, 다른 스레드들이 요청한 수정사항이 모두 반영된 최종 결과의 제약사항(남은 티켓수 등), 최종적인 데이터 정합성만 유지하면 되는가

이 모든 문제상황들은 기본적으로 db에서 제공하는 기능들을 활용하였다.

이에 대한 과정은 이후에 더 자세히 기술하도록 한다.

0개의 댓글

관련 채용 정보