생각정리/기타
한 주 정리 : 24_05 1주차
생각중임
2024. 5. 5. 23:54
이번 주 목표
- 다양한 방법을 이용한 동시성 제어 해보고 비교해 보기 (일반 DB, JPA, 레디스등)
진행 내용
잘된 점
- 동시성 제어
- JPA와 Spring Data JPA를 이용해서 낙관적 락과 비관적 락 방식으로 동시성 제어 코드를 테스트하고 작동 방식을 이해할 수 있었다.
- JPA 락과 Redis의 분산락처리와 비교하면서 동작을 이해할 수 있었다.
동시성 제어를 개념으로만 정리한 것을 실제로 사용하면서 동작에 대한 이해를 좀 더 할 수 있었다. 먼저 비관적 락방식이 가장 간편하게 동시성 문제를 해결할 수 있었다. 낙관적 락은 애플리케이션 계층에서 후처리를 통해서 동시성 이슈를 컨트롤해야 하는데, 로직을 구성하는 게 상당히 까다로웠다. 예외처리에서 동시성 충돌을 잡아 얼마나 재시도를 해줄지 어떻게 재처리를 하고 이후 문제에서 어떻게 해야 할지를 전부 직접 컨트롤하려고 하니 간단한 문제는 괜찮겠지만, 복잡해지면 상당히 어려울 듯했다. Redis를 활용한 분산락 처리 중 Lettuce는 스핀 락형식이라 부담도 많이 가고 락획득 자체가 문제가 많아 보였다. 하지만 Redisson의 경우는 pub/sub 방식으로 비동기 메시지 전송 방식으로 매우 효율적으로 락 획득을 할 수 있어 성능이나 사용측면에서 매우 좋아 보였다. 멀티 서버환경이 아니라 로컬에서는 JPA를 활용한 락과 성능차이는 많이 볼 수 없었지만, 확장성과 추가적인 성능을 원한다면 Redis를 고려를 해봐야 할 듯하다.
부족한 점
- 자바로만 이용한 동시성 제어 테스트
외부라이브러리를 사용하지 않고 자바로만 동시성을 제어하기 위해서 synchronized, reentrantLock, Volatile등을 사용하면서 동시성 제어를 해보려 했지만, 계정에 금액을 넣고 빼는 예제를 만들어 멀티 스레드 환경에서 락을 안 걸었는데도 동시성 이슈가 발생하지 않고 정상적으로 작동해 다른 사람들이 주로 테스트하는 count를 이용해서 테스트하는데도 동시성 이슈가 발생을 하지 않아 동시성 제어를 사용해서 되는지를 알 수가 없었다.
프로젝트를 새로 만들어 보고 스프링 환경, 그냥 메인 메소드만 있는 상태에서도 동시성 이슈가 발생하지 않아 이 부분은 조금 더 시간이 걸릴 듯하다.
다음 주 목표
- 토이 프로젝트에 최적화 적용하고 추가 기능 처리 해보기
- 김영한의 실전 자바 - 중급 1편 강의 시청 및 내용 정리