자바에서 동시성 문제를 다루는 n가지 방법을 소개합니다. 동시성 이슈가 많이 발생하면서도 중요하기도 한 주식 거래 시스템을 예로 들어, 매수와 매도 상황에서 발생할 수 있는 동시성 문제를 정의하고, 이를 해결하는 다양한 해법들 및 테스트 결과를 소개합니다. 예제로 사용한 소스코드는 다음 링크에서 보실 수 있습니다.
https://github.com/renechoi/study/tree/main/java-concurrency-problem/src
먼저, 본 글에서 다루는 기술적 범위의 한계는 다음과 같다.
동시성 이슈를 의도적으로 발생시켜 해결하는 방식을 탐구하는 데 목적이 있다. 이를 위해 간소화된 아키텍처와 어플리케이션 구조, 스타일을 사용하였다.
애플주식 수량 변수(long aaplStockAmount)
를 사용하였다.동시성 문제란, 여러 사용자가 동시에 하나의 대상에 요청을 할 때, 시스템이 어떤 순서로 이를 처리할지 결정해야 하는 상황을 말한다. 예를 들어, 두 개의 동일한 매수 요청이 동시에 하나의 포트폴리오에 요청된다면, 시스템은 한 번에 한 요청만 성공시켜야 하며, 나머지 요청은 대기하게 만들어야 한다.
중복 요청이 무엇이냐에 대한 문제 정의가 필요하다. 문제의 단순화를 위하여 현재 프로젝트에서는 동일한 포트폴리오에 동일한 주식 수량에 대한 입금 요청이 1000ms 미만으로 발생했을 때 중복 요청이 발생했다고 정의한다.
이 문제에서 달성하고자 하는 목표는 다음과 같다.
\- 동시 매수 요청의 순차적 처리: 동시에 여러 매수 요청이 발생할 경우, 이를 순차적으로 처리하여 한 번에 하나의 요청만 성공시키고, 나머지는 실패 처리하여야 한다.