Intro
톰캣 8.5 버전으로 프로젝트를 실행하는데 어플리케이션이 기대한 대로 동작 하지 않았다. 로컬에서는 아무 문제 없이 잘 작동했는데 도커로 톰캣 컨테이너를 띄워 실행키기면 계속 문제가 발생했다.
심지어 에러 로그도 쉽게 찾을 수가 없었다.
tomcat/logs 경로에서 catalina.2022-04-
으로 시작하는 로그에서는 마치 정상적으로 실행 된 것 처럼 보였는데 localhost.2022-04-
로 시작되는 로그 파일을 확인 하자 그제서야 아래와 같은 에러 메시지를 보여줬다.
13-Apr-2022 13:10:54.092 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 3 Spring WebApplicationInitializers detected on classpath
13-Apr-2022 13:10:55.743 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
13-Apr-2022 13:10:57.237 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [springSessionRepositoryFilter]
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionRepositoryFilter' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:872)
...
3 Spring WebApplicationInitializers detected on classpath
가 비극의 서막이었고, 그 후로 springSessionRepositoryFilter 라는 이름으로 등록된 스프링 Bean을 찾지 못해 에러가 발생했다.
원인
Stackoverflow 에서 비슷한 상황을 겪었던 유저들이 옹기종기 모여 있는 글을 찾아 거기에서 힌트를 얻었다.
해당 글의 질문자는 웹어플리케이션 이니셜라이져가 2개가 떴다고 하고, 댓글을 작성한 다른 많은 사용자들도 2개 혹은 나처럼 3개가 뜬 사람들도 있었다.
원인을 정리하자면, 포함하고 있는 라이브러리 중에서 또 다른 WebApplicationInitializer
를 가지고 있다 보니 톰캣을 실행 할 때에 그중에 의도하지 않은 이니셜라이저로 어플리케이션을 실행하려고 했기 때문이다.
해결
본격적인 범인 찾기 시작. 모든 사용중인 라이브러리들에서 구현한 WebApplicationInitializer 목록을 쭉 뽑아 보고 하나씩 체크 해 보았다.
맨 위에 있던 JerseyAutoConfiguration.java 파일을 먼저 체크해보니 spring-boot-autoconfigure 라이브러리에 포함 되어 있는 파일 이다.
두번째 ServletContextInitializer
와 세번째에 위치한 SpringBootServletInitializer
는 스프링 부트 라이브러리에서 왔다.
그리고 그 아래 있는건 클래스명에서 알 수 있듯 각각 Spring Security 및 Spring Session 에서 왔다.
바로 pom.xml 파일을 열고, 하단에 선택된 Text 탭 말고 그 우측에 있는 Dependency Analyzer를 클릭
Dependency Analyzer
바로 강력한 용의자가 눈에 띈다. 지금 이 프로젝트는 다른 프로젝트와 세션 공유를 하지 않는다.
<exclusion>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</exclusion>
해당 라이브러리를 제외 하고 다시 빌드 한 뒤에 실행 시켜 보았다.
2 Spring WebApplicationInitializers detected on classpath
WebApplicationInitializers가 한개 줄어들었다. 말썽을 부리던 범인이 맞을까?
새로운 war파일로 어플리케이션을 실행해 확인해보니 문제가 해결 되어 정상적으로 잘 작동 된다.
마지막으로 Spring WebApplicationInitializers가 한개만 감지 되도록 해보려고 불필요한 의존성들을 모두 제거 해 보았지만 마피아는 하나도 없고 모두 선량한 시민들 뿐 이었다.
결론: 톰캣이 엉뚱한 WebApplicationInitializers 를 사용하다 에러가 발생하면, 찾아서 의존성을 제거해주자.
'Development > Daily Error' 카테고리의 다른 글
Spring Boot 단독실행시 no main manifest attribute 에러 해결 (0) | 2022.04.26 |
---|---|
일간에러) java: incompatible types: java.lang.String cannot be converted to org.slf4j.Marker (0) | 2022.04.20 |
일간에러) application.yml 파일을 못읽을때 spring.config.location (0) | 2022.04.05 |
Spring Session과 Cookie SameSite 정책 (0) | 2022.04.01 |
일간에러 More than one fragment with the name [spring_web] was found. (0) | 2022.03.17 |