Closed daadaadaah closed 2 months ago
싱글 스레드, Synchronized 방식, Lock 방식은 각각 서로 다른 동시성 제어 방법을 제공하며, 각 방식은 고유한 장단점을 가지고 있습니다. 아래에서 이 세 가지 방식의 상대적인 장단점을 비교해 보겠습니다.
싱글 스레드 방식: 데이터의 정확성, 안정성, 예측 가능성이 중요하고, 성능보다는 코드의 간결함과 안전성이 우선시되는 경우 적합합니다. 특히 병렬 처리가 필요 없는 작업에서 유리합니다.
Synchronized 방식: 동시성이 필요한 간단한 애플리케이션에서, 비교적 적은 복잡성으로 안전한 동기화를 제공할 수 있습니다. 자바에서 쉽게 사용할 수 있는 기본 동기화 방식으로, 많은 경우에 적절한 성능과 안정성을 제공합니다.
Lock 방식: 고성능이 요구되거나, 복잡한 동기화 제어가 필요한 경우 유리합니다. 정확한 락 관리가 필요하거나, 데드락 방지와 같은 고급 기능이 필요한 상황에서 적합합니다. 그러나 구현의 복잡성이 더해지는 점을 고려해야 합니다.
이러한 장단점을 바탕으로, 시스템의 요구 사항에 맞춰 적절한 동시성 제어 방법을 선택하는 것이 중요합니다.
문제
해결 과정
1. 재현
https://github.com/user-attachments/assets/76f2e9bf-17cc-4486-93e4-f1985a4a443f
2. 원인 파악
동일한 행에 데이터가 덮어쓰기
가 되면서 데이터 누락이 발생한 것이었습니다.@Async
을 사용하여 비동기로 실행되는데, 이@Async
의 기본 동작 방식은 멀티스레드 방식으로 동작합니다.race condition
발생하여, 데이터가 덮어씌워지는 동시성 문제가 발생한 것이었습니다.3. 다양한 해결 방법 모색
2. 동기화와 관련된 복잡한 로직이 필요 없으므로, 코드가 단순하고 구현이 쉽습니다.
3. 문제 발생 시 재현이 쉬워 디버깅과 유지보수가 용이합니다.
4. 데드락 발생 가능성이 없으므로, 동시성 관련 오류 발생 확률이 낮습니다.
2. Lock을 사용하는 방식보다 구현이 단순하며, 기본적으로 자원 보호를 쉽게 구현할 수 있습니다.
3. 간단한 동기화가 필요한 경우 효율적일 수 있습니다.
2. 동기화 블록보다 더 유연하고 높은 성능을 제공할 수 있습니다.
3. 특정 상황에서는 `synchronized` 방식보다 효율적일 수 있으며, 공정성(Fairness)을 제공하는 Lock도 사용 가능합니다.
4. 복잡한 동시성 제어가 필요한 경우, 더 강력한 제어 메커니즘을 제공합니다.
2. CPU의 멀티코어 활용이 어렵고, 작업량이 많아질수록 성능 저하가 심각할 수 있습니다.
2. 동시성 문제를 완전히 해결하기 위해서는 추가적인 동기화 작업이 필요할 수 있어서, 방법 1보다 구현이 복잡하다.
3. 데드락이 발생할 수 있으며, 문제 발생 시 재현이 어렵습니다.
2. 방법 1와 2이 비해 구현이 가장 복잡합니다.
3. 문제 발생 시 재현이 어렵습니다.
4. Lock을 잘못 관리하면 데드락이 발생할 수 있습니다.
4. 최종 해결책 선택
방법 1. 싱글 스레드
을 선택하였습니다.(1) 로그 저장 로직의 특징
(2) 싱글 스레드가 적합하다고 생각한 이유
방법 1.싱글 스레드 방식
을 선택했습니다.방법 2. Synchronized 방식
과방법 3. Lock 방식
은 둘다 호출 순서가 보장되지 않는 점, 구현이 방법 1에 비해 복잡하다는 점, 문제 발생시 재현이 어렵다는 점 때문에, 지금 상황에 적절하지 않다고 생각했습니다.(3) 싱글 스레드 구현
ThreadPoolTaskExecutor
를 활용하여싱글 스레드 풀
을 만들고, 로그 저장 작업이 이 스레드에서 순차적으로 처리되도록 설정하였습니다.logSaveHandlerExecutor
를 사용하여 로그 저장 메서드들이 모두 동일한 스레드에서 실행되도록 하였습니다.성과
https://github.com/user-attachments/assets/adf17393-bf23-4562-9357-f56b56997817
1. 데이터 일관성 확보
2. 호출 순서 유지
3. 구현의 용이 및 예측 가능성