• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우

21.03.24 16:40 작성 조회수 154

0

기선님 안녕하세요.. 제가 java class 파일(WebAppInit.java, WebSecurityConfig.java )로 되어 있던 설정을 web.xml, security-context.xml방식으로 바꾸어보았는데요.. 

바꾸고 나서 서버를 재시작 해보니까 classnotfoundexception이 뜨면서 

Caused by: java.lang.NoClassDefFoundError: com/legalcounsel/javaprj/config/WebSecurityConfig

at com.legalcounsel.javaprj.config.WebAppInit.getRootConfigClasses(WebAppInit.java:22)

이런 오류가 발생하는데요.. 왜 그런걸까요??? 원래 서버 시작하면 톰켓이 -> web.xml가서 먼저 읽고 그다음 -> dispatcher-servlet.xml 읽는거 아닌가요'?? spring security까지 추가해 놓을 경우 web.xml 후에 filter가 먼저 실행되고, dispatcher servlet.xml이 그다음 실행되고 그 후에interceptor실행된 후 controller 실행되는 걸로 아는데요...

처음부터 xml로 가지 않고 왜 기존에 설정되어 있던 자바클래스(webAppInit.java랑 WebSecurityConfig.java) 지웠냐고 에러가 발생하는데.. 당연히 xml방식으로 바꾸면 xml로 대체할 수 있는 거 아닌가요?? ㅜㅜ 

답변 1

답변을 작성해보세요.

0

Caused by: java.lang.NoClassDefFoundError: com/legalcounsel/javaprj/config/WebSecurityConfig

 at com.legalcounsel.javaprj.config.WebAppInit.getRootConfigClasses(WebAppInit.java:22)

WebAppInit이랑 WebSecurityConfig를 지웠냐고 에러가 나고 있는게 아니라 WebAppInit에서 참조하는 WebSecurityConfig를 못찾겠다고 에러가 나고 있는거라 WebAppInit쪽 코드를 살펴보셔야 합니다.

그리고 web.xml 기반으로 애플리케이션을 만드시는데 WebAppInit은 필요없지 않을까요?

DYB님의 프로필

DYB

질문자

2021.03.25

안녕하세요 기선님.. 제가 원래는 누가 만들어 놓은 프로젝트를 가지고 압축파일을 풀어서 공부하고 잇는 건데요..

spring을 사용하려면 web.xml방식과 java클래스파일로 annotation방식 이용하는 것을 자유자재로 바꿀 수 있어야 한다는 말을 듣고 config라는 package에 있던 webAppInint.java를 web.xml로 바꾸어 보고, WebSecurityConfig.java를 security-context.xml방식으로 바꾸어보는 도중에 에러가 발생 한 것인데요 (config package에 있던 모든 클래스 파일 지우고 xml로 변경한 상태입니다..)

Caused by: java.lang.NoClassDefFoundError: com/legalcounsel/javaprj/config/WebSecurityConfig

at com.legalcounsel.javaprj.config.WebAppInit.getRootConfigClasses(WebAppInit.java:22)

at org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer.createRootApplicationContext(AbstractAnnotationConfigDispatcherServletInitializer.java:56)

at org.springframework.web.context.AbstractContextLoaderInitializer.registerContextLoaderListener(AbstractContextLoaderInitializer.java:60)

at org.springframework.web.context.AbstractContextLoaderInitializer.onStartup(AbstractContextLoaderInitializer.java:50)

at org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.onStartup(AbstractDispatcherServletInitializer.java:63)

at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5160)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

... 10 more

에러 메시지 전체를 보면 (WebAppInit에서 참조하는 )WebSecurityConfig가 없다하고, (WebAppInit.java:22)는 지운 상태라 클릭해도 source가 없다고 뜨는데요...

누가 WebAppInit.java를 실행시키라고 처음에 명령하는 지를 모르겠어요.. 

바로 밑에 빨간 줄 보면 AbstarctAnnotationConfigDispatcherServletInitializer에 들어가서 봐도 WebAppInit 실행시키라는 게 없고 디버깅 모드로 실행시켜보면 NoClassDefFoundEroor에서 그냥 걸리고 서버가 완전히 실행되지 않고 Timeout에 걸려서 디버거 모드가 종료되더라구요(Timeout시간 늘려도 똑같아요..) 

혹시 서블릿이나 springwebmvc버전에 따라 web.xml을 참조하는지, WebAppInit.java를 참조하는지 애초에 설정이 다르게 되어 있는 것인가요???

그리고 spring 처음 배우는 사람은 무조건 boot부터 시작하지말고 의존성 설정하는 거 한 번 쯤은 해봐야하며 xml-> java클래스 파일로 바꾸는 연습 해보아야 한다는 말이 있어서 그렇게 공부시도해보고 있는 중인데.. 의미있는 일 맞겠죠??? 누구는 그냥 뭐하러 spring4.0, 5.0공부하냐 그냥 boot로 시작해라 라 하고 의견이 다양하네요.. 좋은 강의 찍어주셔서 감사합니다!! ㅎㅎ

본문에 붙여 넣으신 스택트레이스(빨간색)를 보면 어떤 흐름을 타고 WebAppInit을 실행했는지 보이죠? 지금 하시려는게 web.xml로 스프링 MVC를 설정하는걸 해보신다고 했는데, 제 수업 중에  "스프링 IoC 컨테이너 연동"과 "스프링 MVC 연동" 수업을 다시 들어보시면 좋겠습니다.

자세한 내용은 스프링 문서를 참고하세요.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/WebApplicationInitializer.html

스프링이랑 스프링 부트는 다른거니까 각기 따로 공부하는게 맞는거죠.

감사합니다.

DYB님의 프로필

DYB

질문자

2021.03.26

넵 기선님... ㅎㅎ 

답변 정말 감사합니다!!