인프런 커뮤니티 질문&답변

pos9101님의 프로필 이미지
pos9101

작성한 질문수

스프링 부트 - 핵심 원리와 활용

스프링 컨테이너 등록

AppInitV2Spring 오류 및 AppInitV3SpringMvc 미동작 문의

작성

·

796

·

수정됨

5

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
"스프링 컨테이너 등록" 강의에서 작성하는 코드

HelloConfig, HelloController, AppInitV2Spring

 

이렇게 작성하게 되는데요. 무료버전의 톰캣 설정 문제가 아니라는 것은 이전 강의 V1까지는 제대로 실행이 완료된 상태입니다.

그래서 V1까지는 잘 되었으나 AppInitV2Spring 코드를 작성하고 빌드하면

IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생 -> caused by LifecycleException: 구성요소

[StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]을(를) 시작하지 못했습니다.

-> caused by java.lang.NoClassDefFoundError

-> ClassNotFoundException 형태로 오류가 뜹니다.

자세한 오류는 맨 아래 첨부합니다.

 

신기한건 기존에 war 파일 형태로 빌드($gradlew build)하여

tomcat/libs/webapps

에 ROOT.war 로 올리고 톰캣을 별도로 실행한다음에

localhost:8080/spring/hello-spring

주소를 입력하고 테스트 할 때는 잘뜨니까 미치겠습니다. ..ㅜㅜ

 

오류가 나니 AppInitV2Spring 내용은 주석처리하고 다음강의인 AppInitV3SpringMvc를 작성했는데요.

해당 onStartup()은 호출부터 안되네요... "AppInitV3SpringMvc.onStartup" 부터 로그가 안찍힙니다..

이것 역시 혹시나...? 하고 war파일로 빌드하여

톰캣 webapps에 넣고 직접 톰캣 실행 후

localhost:8080/hello-spring

localhost:8080/spring/hello-spring

.. 전부 잘됩니다.... ㅠㅠ

 

MyContainerInitV1.onStartup
MyContainerInitV1 c = null
MyContainerInitV1 ctx = org.apache.catalina.core.ApplicationContextFacade@5a411614
MyContainerInitV2.onStartup
MyContainerInitV2 c = [class hello.container.AppInitV1Servlet, class hello.container.AppInitV2Spring]
MyContainerInitV2 ctx = org.apache.catalina.core.ApplicationContextFacade@5a411614
AppInitV1Servlet.onStartup
10-Jan-2024 19:59:26.303 SEVERE [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [C:\Users\oksu\.SmartTomcat\server\server\conf\Catalina\localhost\ROOT.xml]을(를) 배치하는 중 오류 발생
	java.lang.IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
		at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
		at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:712)
		at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:643)
		at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1939)
		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
		at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
		at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
		at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:536)
		at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426)
		at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1661)
		at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
		at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114)
		at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
		at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
		at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893)
		at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
		at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
		at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
		at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
		at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		at org.apache.catalina.startup.Catalina.start(Catalina.java:795)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:568)
		at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
	Caused by: org.apache.catalina.LifecycleException: 구성요소 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]을(를) 시작하지 못했습니다.
		at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:419)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:186)
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
		... 37 more
	Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/WebApplicationContext
		at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
		at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
		at java.base/java.lang.Class.getConstructor0(Class.java:3578)
		at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
		at hello.container.MyContainerInitV2.onStartup(MyContainerInitV2.java:22)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		... 38 more
	Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.WebApplicationContext
		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353)
		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
		... 45 more
10-Jan-2024 19:59:26.312 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [C:\Users\oksu\.SmartTomcat\server\server\conf\Catalina\localhost\ROOT.xml]의 배치가 [747] 밀리초 내에 완료되었습니다.
10-Jan-2024 19:59:26.315 INFO [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
10-Jan-2024 19:59:26.491 INFO [main] org.apache.catalina.startup.Catalina.start 서버가 [996] 밀리초 내에 시작되었습니다.
http://localhost:8080/
10-Jan-2024 20:02:05.720 INFO [Thread-1] org.apache.coyote.AbstractProtocol.pause 프로토콜 핸들러 ["http-nio-8080"]을(를) 일시 정지 중
10-Jan-2024 20:02:05.748 INFO [Thread-1] org.apache.catalina.core.StandardService.stopInternal 서비스 [Catalina]을(를) 중지시킵니다.
10-Jan-2024 20:02:05.749 INFO [Thread-1] org.apache.coyote.AbstractProtocol.stop 프로토콜 핸들러 ["http-nio-8080"]을(를) 중지시킵니다.
10-Jan-2024 20:02:05.755 INFO [Thread-1] org.apache.coyote.AbstractProtocol.destroy 프로토콜 핸들러 ["http-nio-8080"]을(를) 소멸시킵니다.

 

 

 

답변 3

11

안녕하세요. pos9101, 박준일님, 공식 서포터즈 OMG입니다.

수정 방안 뿐만 아니라, 제가 확인한 과정까지 전달드리면 이후 동일한 문제가 발생하는 분들에게 도움이 되실 것 같아 같이 첨부합니다 😀

 

일단 처음 예상했던 문제는 인텔리제이 버전이 올라가서 스마트 톰캣과의 호환성 문제일까? 생각하고 아래와 같이 커뮤니티 버전을 상위 버전부터 마이너 버전을 낮춰가면서 확인하였습니다.

 

인텔리제이 커뮤니티 버전 2023.3.2

image

인텔리제이 커뮤니티 버전 2023.1.5

image

인텔리제이 커뮤니티 버전 2022.2.5

image

결과화면을 보시다시피

버전 별로 실행했을 때 결과가 오류만 발생하거나(2023.3.2), 오류 발생 + 콘솔 출력(2023.1.5) , 오류도 없고, 콘솔 출력도 없어서(2022.2.5)

버전 문제보다는 설정 문제로 예상하여 스마트 톰캣 설정을 확인해보았습니다.

 

처음 캡쳐한 화면(2023.3.2)일 때의 Use classpath of module은 server였는데요

image

이 설정을 server.main으로 변경하니 오류 없이 실행되었습니다.

image

 

감사합니다.

 

감사합니다!!

pos9101님의 프로필 이미지
pos9101
질문자

감사합니다. smart tomcat edit 옵션 server -> server.main 으로 설정 변경하니 바로 됩니다 ;)

OMG님 말씀대로 Smart Tomcat의 설정을 변경하니 실행되지 않던 URL(http://localhost:8080/spring/hello-spring)이 정상 동작하였습니다.

김영한님의 수업자료도 이 설정 부분에 대한 내용이 변경이 되어야 할 것 같습니다.

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. pos9101, 박준일님

코드를 한번 확인해봐야 할 것 같습니다.

  1. 추가로 현재 IntelliJ 내부에서 톰캣을 설정해서 실행하는 경우에만 문제가 되고, 외부 톰캣을 직접 사용하는 경우에는 정상 작동하는 것 일까요?

     

  2. 실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

안녕하세요 강사님.

우선 좋은 강의 제공해주셔서 감사합니다.

 

pos9101 작성자님 , 작성자님 게시글에 추가 댓글로 질문하는 점 죄송합니다. 같은 내용이 중복으로질문이 올라오는것 보다 한 번에 보면 좋을거 같아서 댓글로 남겼습니다.

 

  1. 추가로 현재 IntelliJ 내부에서 톰캣을 설정해서 실행하는 경우에만 문제가 되고, 외부 톰캣을 직접 사용하는 경우에는 정상 작동하는 것 일까요?

    => 네 외부 톰캣을 직접 사용해서 ROOT.war 파일로 실행하면 제대로 실행이 됩니다.

[외부 톰캣 사용시 catalina.out 내용]

image

  1. 실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

    =>아래 링크 입니다.

https://drive.google.com/file/d/1ecX11UFFXMeOPHHhqkb7b43litVuK173/view?usp=drive_link

 

 

인텔리제이 내부에 설정한 톰캣 정보 입니다.

  • Run Configurations

    image

  • Configure 버튼 클릭시

    image

  • smart-tomcat 디렉토리 위치, 내부

    image

 

 

 

image

 

저도 작성자님과 마찬가지로 V1까지는 강의 내용대로 제대로 돌아갔고, AppInitV2Spring 작성 이후부터 나온 현상입니다. AppInitV2Spring 내용을 다 지우고 다시 톰캣 시작시에도 위와 같이 실행이 안되고 있습니다. 혹시 추가로 필요한 내용이 있으면 말씀 해주세요..!

위에 남긴 제 답변 댓글을 참고해주세요 😀

pos9101님의 프로필 이미지
pos9101
질문자

감사합니다... 제가 질문을 해놓고 제일 늦게 보았네요. 박준일님이 설명하신 것과 동일하고, OMG님께서 알려주신 방법으로 해결 했습니다. Smart Tomcat의 server -> server.main 으로 하니깐 잘됩니다.

2

저도 같은 내용으로 하루 종일 헤매고 있네요.. 아주 똑같은 현상으로 그 전까진 테스트하면서 잘 따라하다가 AppInitV2Spring 코드를 추가하고 나서부터 같은 로그가 나오면서 실행이 안됩니다..!

imageimage

pos9101님의 프로필 이미지
pos9101

작성한 질문수

질문하기