* 문제점
개발중인 기존 프로그램에서는 특정 기능을 수행 할 시
모든 로그(오류로그 제외)를 공통 데이터 테이블 에 저장했습니다.
또한 5초간격으로 자동 리프레시를 수행하는 기능이 존재하여
병원마다 5초간격으로 로그가 쌓이는데 이 부분이 하나의 병원일때는 별문제가 없는거
같지만 만약 100곳에서 동시에 자동리프레쉬 기능을 수행하면
한번에 100개의 로그가 디비 row에 저장되기 때문에 다른 로그를 찾아보기 어려울 뿐더러
다음과 같은 문제가 발생할 수도 있습니다.
* 상황
개발 중인 프로그램에서 기존에는 Spring 서버에 Interceptor에서 로그를 쌓고있었는데
그 방식을 보면 Interceptor의 preHandler()메서드에서 로그에 대한정보 (ex ip, 키값 등)을
(전역) map에 저장한 후 다음 순서인 postHanler()메서드가 실행될 때 데이터베이스에 저장하고있었습니다.
이 부분에서 일어난 문제가 데이터 로그가 저장되기 전에 다음 데이터 혹은
이전 데이터의 정보가 덮어씌기를 해버려서 잘못된 로그가 저장되는 문제가 발생했었습니다.
* 해결 방법
때문에 해당문제를 해결하기위해서 기존 interceptor에서 나누어 저장하는 것을
Filter 부분으로 로그 저장로직을 이전시켜서 해당 문제를 수정했습니다.
추후에 해당 문제에 대해서 명확하게 알기위해 찾던 중
아래 이미지를 보고 떠오르는 것이 있어 문제를 유추 해보았습니다.
정확히 기억은나지않지만 스프링은 다중처리를 위해서 쓰레드 풀을 구성하여
다중쓰레드를 사용한다고 기억하는데 위 이미지를 보면 인터셉터는 스프링영역에 존재하고,
필터는 바깥쪽에 존재합니다.
이를 봤을때 필터에서는 다중쓰레드를 사용하지 않거나 동기화 처리를 하여서 로그를 저장할 때
같은 정보에 접근하더라도 문제가 발생하지 않는것이 아닌가 생각했습니다.
일단은 프로그램에서 문제를 해결했지만 해당부분에 대한 학습을 추가적으로 진행 할 예정이고 추후에
글을 추가적으로 작성해 공유하도록 하겠습니다.
'라이브러리 > Spring boot' 카테고리의 다른 글
Spring Boot에서 API 개발 시 Response 반환 형식 문제 해결 방법 (0) | 2023.09.02 |
---|---|
Application.yml Profiles를 활용한 환경 별 DB 설정 (0) | 2023.06.08 |