동시성 문제
다수의 스레드가 동시에 공유 자원에 접근할 때 발생한다.
애플리케이션 개발에서의 동시성
다중 스레드
애플리케이션 개발에 주로 사용하는 스프링 부트의 경우 Tomcat을 내장하고 있다.
Tomcat은 다중 요청을 처리하기 위해, 부팅할 때 Thread Pool을 생성한다.
애플리케이션에서는 미리 생성한 Thread Pool의 Thread를 통해 유저의 요청을 처리한다.
이때 Thread는 동시에 공유 자원에 접근 할 수 있고 그 결과 동시성 문제가 발생할 수 있다.
공유 자원
애플리케이션 개발에서 공유자원은 DB에 저장된 정보가 대표적일 것 같다.
DB 공유 자원
DB에 저장된 정보에 접근하여 정보를 변경할 수 있는 고객이 여러 명이다.
- 글
- 작성자
- 재목
- 내용
- 조회 수
- 좋아요
위와 같은 정보를 저장하고 있는 글
의 경우 제목
, 내용
에 대한 고객은 작성자
하나이자만 조회수
, 좋아요
에 대한 고객은 해당 기능의 요청을 하는 사용자
로 여러 명이 될 수 있다.
- 상품
- 상품 명
- 가격
- 재고
동시성 예시에서 가장 많이 등장하는 재고
의 고객 역시 재고를 감소시키는 기능을 요청하는 사용자
인 구매자가 여러 명이 될 수 있다.
DB 공유 자원 동시성 문제 상황
공유 정보의 값을 기반으로 공유 정보를 변경하는 요청을 수행하는 상황
DB 공유 자원을 변경하는 Request1
요청이 종료되기 이전에 Request2
요청이 시작되면 두 요청 모두 요청에 의한 값 변경 이전의 값을 기준으로 요청을 수행하게 된다. ( 위의 이미지에서는 두 요청 모두 0을 기준으로 요청을 수행 )
이에 공유 정보의 값을 기반으로 공유 정보를 변경하는 DB 조회 결과를 1 증가
요청이 동시에 2번 수행되어 정상적 요청에서 기대할 수 있는 결과인 2가 아닌 1이 결과로 저장되는 문제를 확인할 수 있다.
추가 예시 )
- 재고 차감 기능 예시 : 재고라는 공유자원을 차감하는 기능에서 발생할 수 있는 동시성 문제
- 좋아요 수 증가 예시 : 좋아요라는 공유자원을 증가하는 기능에서 발생할 수 있는 동시성 문제
공유 정보의 값을 기준으로 이후 작업을 수행하는 상황
Reqest1~3
은 요청 시 DB 공유 자원이 LAST ONE
이기에 OK
응답을 받아 요청을 수행한다.
Request1
요청이 완료된 이후 DB 공유 자원을 조회한 Request4
는 BAD
응답을 받아 요청을 수행하지 않는다.
이에 공유 정보의 값을 기준으로 이후 작업을 수행하는 작업이 동시에 3개 요청되어 기대하지 않았던 Request2~3
요청이 추가적으로 수행되는 문제를 확인할 수 있다.
추가 예시 )
- WVM 재고 할당과 취소 예시 : 할당 상태를 기준으로 재고 할당과 취소 기능을 구현하여 발생한 동시성 문제
DB 공유 자원 동시성 문제 공통 사항
동시에 들어온 공용 자원의 변경이 포함된 여러 요청이 서로 다른 스레드에서 동시에 수행되며 요청에 따른 공용 자원의 변경 이전의 값을 사용하여 요청을 처리하고 있어 동시성 문제가 발생하는 것을 확인할 수 있다.
DB 공유 자원 동시성 문제 해결 방법
- DB
- 낙관적 락
- 비관적 락
- 애플리케이션
- 스핀락
- 분산락
- 이벤트 소싱을 이용한 비동시성 문제로 전환
'개발' 카테고리의 다른 글
[FEW] MVP 기능을 구현하며 (0) | 2024.07.14 |
---|---|
이미지가 포함된 multipart/form-data 요청 Swagger-UI 만들기 (0) | 2024.06.28 |
다중화 어플리케이션 환경에서 동시성 처리하기 (0) | 2024.05.27 |
위치 기반 프로젝트를 준비하며 (0) | 2024.04.23 |
데코레이터 패턴을 활용하여 행위를 정의하기 (0) | 2024.04.10 |