동시성 문제란 무엇인가?
Concurrency problems occur when multiple transactions are being executed on the same database in unrestricted problems.
동시성 문제는 동일한 데이터베이스에서 여러 트랜잭션이 동시에 실행될 때 발생합니다.
즉, 동시성 문제는 동일한 데이터에 대해 여러 트랜젝션이 동시에 수행될 때 발생하는 문제입니다.
스프링에서 동시성 문제 해결의 분류
스프링에서 동시성 문제를 해결할 수 있는 방법은 크게 3가지로 나눌 수 있습니다.
1. 코드단에서 지원하는 Lock을 이용한 Application 내부 스레드 동기화
2. MongoDB, Redis와 같은 인메모리 DB를 이용한 트랜젝션 동기화
3. DB자체에 Lock을 걸어 데이터 수정 동기화
각각의 해결 방법은 적용 난이도와 적용 가능한 상황에 차이가 있습니다.
현재 상황에 맞는 방법을 채택하여 문제를 해결하는 것을 추천합니다.
첫 번째 해결 방법 "코드단에서 지원하는 Lock을 이용한 Application 내부 스레드 동기화" 의 장단점
장점
코드 내부에서 미리 구현된 Lock 라이브러리를 임계영역에 걸어주기만 하면 되므로 구현이 간편하다.
단일 프로세스로 실행되는 애플리케이션인 경우 잘 작동한다.
단점
서버 스케일 아웃등의 이유로 멀티 프로세스로 운영되는 서버 환경에서는 제대로 동작하지 않는다.
결론 - 가벼운 서비스의 빠른 문제 해결 방법에 사용될 수 있지만, 서버 확장성을 고려했을 때 좋은 선택은 아니다.
두 번째 해결 방법 "MongoDB, Redis와 같은 인메모리 DB를 이용한 트랜젝션 동기화"의 장단점
장점
여러 프로세스에 대해 일관성 있는 해결책이 될 수 있다.
인메모리 DB를 이용하므로 속도가 DB락에 비해 상대적으로 빠르다.
기존에 인메모리 DB를 서비스에서 사용 중이라면 기술 구현에 드는 비용이 적다.
단점
기존에 Redis와 같은 인메모리 DB가 서비스에 구축되어 있지 않았다면, 세팅하는데 드는 시간/기술적 비용이 크다.
결론 - 서버의 확장에는 열려 있는 좋은 해결법이나, 기존 세팅에 의해서 비용이 차이가 있다.
세 번째 해결 방법 "DB자체에 Lock을 걸어 데이터 수정 동기화"의 장단점
장점
DB 자체에서 Lock을 거는 것이므로 위와 같이 여러 프로세스에 대해 일관성 있는 해결책이 될 수 있다.
일반적이고 고전적인 해결 방법이므로 많은 레퍼런스를 찾을 수 있다.
단점
다른 동기화 방법에 비해서 초기 지식이 없다면 기술 공부에 드는 비용이 더 크다.
스프링의 Entity 코드에 DB 종속적인 코드가 추가되게 된다.
결론 - RDB를 쓰는 것이 확정적이고 이후로도 변할 일이 크게 없다면 사용하는 것을 추천한다.
위와 같은 장단점들이 존재합니다.
최근에 알고리즘 스터디 사이트의 트러블 슈팅을 하면서 동시성 문제를 다룰 일이 있어서 공부한 내용을 정리해 보았습니다.
저는 크롤링을 동시에 진행하는 동시성 문제를 해결하기 위해서 첫 번째 해결 방법인 코드 수준 Lock을 이용했습니다.
이는 저희 서버가 단일 애플리케이션으로 동작하는 구조이고, EC2보다 나은 사양의 서버를 이용할 금액적 여유가 없는 팀의 사정을 고려하여 스케일 아웃을 할 가능성이 적다고 고려하여 빠른 문제 해결을 위해서 위와 같은 해결 방법을 적용했습니다.
추후 서버를 스케일 아웃하게 된다면, 세 번째 해결 방법인 DB락으로 코드를 수정할 계획입니다.
'Develop(개발)' 카테고리의 다른 글
[AWS] 프리티어 VPC 과금 문제 해결법 (RDS Public IP 없이 MySQL 워크벤치 연결) (0) | 2024.07.18 |
---|---|
스프링이 어떻게 여러 요청을 동시에 처리할 수 있을까? (0) | 2024.03.10 |
Github Action에서 간단한 테스트 자동화 하기! (4) | 2024.02.25 |
vscode 터미널에서 실행하는 환경변수 직접 설정하는 방법 (0) | 2023.10.03 |