반응형
프로젝트 진행 시 Spring 서비스에서 DB 커넥션 및 메모리를 과다 사용하는 이슈가 있었고 이를 해결한 방법에 대해 정리해 보았습니다.
1. 이슈 상황
Spring 서비스 기동 시(Spring 4. Tomcat 으로 기동) Spring 서비스에서 DB로 연결하는 커넥션 수 및 서버 메모리 사용량이 2배 이상 사용하는 문제가 있었습니다.
2. 문제 원인 / 해결 방안
문제의 원인은 Spring 애플리케이션이 기동 시 톰캣 인스턴스는 1개인데, 그 안에서 스프링 컨텍스트가 2번 올라가면서 로그가 두 번씩 찍히고 메모리 및 DB 커넥션을 두 배로 먹는 현상이었습니다 (Double Deployment)
이 현상은 다음 조건이 겹쳤을 때 발생합니다.
- server.xml 하단에 <Context docBase="내앱경로" path="/" /> 처럼 컨텍스트를 수동으로 지정해 두었다.
- server.xml에 autoDeploy와 deployOnStartup 옵션이 없다.
- 그런데 그 "내앱경로"가 톰캣의 webapps 폴더 안에 있다.
이럴 경우 아래와 같은 순서로 애플리케이션이 기동됩니다.
- 톰캣 기동 시 server.xml을 읽고 <Context>에 적힌 앱을 첫 번째로 실행합니다.
- 그다음 <Host> 설정으로 넘어오는데, deployOnStartup이 안 적혀있으니 기본값인 true로 작동합니다.
- 톰캣이 webapps 폴더를 쓱 훑어봅니다. 아까 실행했던 그 앱이 또 들어있네요? 이걸 새로운 앱으로 착각하고 두 번째로 또 실행합니다.
- 스프링 빈(Bean)이 두 번 생성되고, 스케줄러(Cron)가 두 번씩 도는 대참사가 발생합니다.
3. 해결 방법
해당 문제는 Tomcat 설정 파일에 autoDeploy 및 deployOnStartup 옵션 값을 "false"로 추가해서 해결했습니다
이렇게 하면 톰캣 기동 시 <Context>에 적힌 앱을 실행하고 톰캣 기동 프로세스가 끝나기 때문에 2번 기동되는 경우는 없어집니다.
(단, 이 경우 webapps 안에 무언가를 넣어도 톰캣을 껐다 켜기 전엔 자동 배포가 안 됩니다.)
Server.xml :
<Host name="localhost" appBase="webapp" unpackWars="true" autoDeploy="false" deployOnStartup="false>
..
</Host>

반응형
댓글