라이브러리/Spring boot

Spring Boot Web Server Log 저장 문제

하나의묵 2022. 9. 16. 22:32

* 문제점 

개발중인 기존 프로그램에서는 특정 기능을 수행 할 시

모든 로그(오류로그 제외)를 공통 데이터 테이블 에 저장했습니다.

 

또한  5초간격으로 자동 리프레시를 수행하는 기능이 존재하여 

병원마다 5초간격으로 로그가 쌓이는데 이 부분이 하나의 병원일때는 별문제가 없는거

같지만 만약 100곳에서 동시에 자동리프레쉬 기능을 수행하면

한번에 100개의 로그가 디비 row에 저장되기 때문에 다른 로그를 찾아보기 어려울 뿐더러

다음과 같은 문제가 발생할 수도 있습니다.

 

* 상황 

개발 중인 프로그램에서 기존에는 Spring  서버에 Interceptor에서 로그를 쌓고있었는데

그 방식을 보면 Interceptor의 preHandler()메서드에서 로그에 대한정보 (ex ip, 키값 등)을

(전역) map에 저장한 후 다음 순서인 postHanler()메서드가 실행될 때 데이터베이스에 저장하고있었습니다.

 

이 부분에서 일어난 문제가 데이터 로그가 저장되기 전에 다음 데이터 혹은

이전 데이터의 정보가 덮어씌기를 해버려서 잘못된 로그가 저장되는 문제가 발생했었습니다.

 

* 해결 방법

때문에 해당문제를 해결하기위해서 기존 interceptor에서 나누어 저장하는 것을

Filter 부분으로 로그 저장로직을 이전시켜서 해당 문제를 수정했습니다.

 

 

 

추후에 해당 문제에 대해서 명확하게 알기위해 찾던 중

아래 이미지를 보고 떠오르는 것이 있어 문제를 유추 해보았습니다.

 

이미지 출처 :  https://goddaehee.tistory.com/154

 

정확히 기억은나지않지만 스프링은 다중처리를 위해서 쓰레드 풀을 구성하여

다중쓰레드를 사용한다고 기억하는데 위 이미지를 보면 인터셉터는 스프링영역에 존재하고,

필터는 바깥쪽에 존재합니다. 

 

이를 봤을때 필터에서는 다중쓰레드를 사용하지 않거나 동기화 처리를 하여서 로그를 저장할 때

같은 정보에 접근하더라도 문제가 발생하지 않는것이 아닌가 생각했습니다.

 

일단은 프로그램에서 문제를 해결했지만 해당부분에 대한 학습을 추가적으로 진행 할 예정이고 추후에 

글을 추가적으로 작성해 공유하도록 하겠습니다.