inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

servletApplication.main()메소드가 게속 실행되는데 끝나질 안아요?

2366

사탕

작성한 질문수 13

0

spring MVC

답변 3

1

사탕

명확한 설명 감사드리고 한글은 다른방법으로 해결햇어요!!

0

Omnibus

잘 해결하셨다니 다행입니다. 즐거운 코딩 되세요~

1

Omnibus

해당 부분은 영한님 강의 자료 5페이지에 설명이 되어 있어서 발췌해왔습니다.

1. 실행을 Gradle로 설정하면, tomcat 의존성을 유지
2. 실행을 IntelliJ IDEA로 설정하면, tomcat 의존성을 제거

저 또한 커뮤니티 에디션으로 테스트를 했다고 말씀 드렸는데, IntelliJ IDEA 실행에 tomcat 의존성을 유지하고도 질문자님과 같은 오류가 발생하지 않았던 이유는, ServletApplication 클래스에 @ServletComponentScan 어노테이션을 붙이지 않고 실행해서 그렇습니다. 즉, 제가 이후 단계인 HelloServlet이 정상 동작하는지까지 테스트하지 않았다는 의미죠.
영한님 강의를 따라가는 전체 흐름으로 보자면 추가로 말씀하신 문제가 충분히 발생할 수 있는데, 제가 거기까지 생각을 못 하고 질문 내용인 메인 메서드 실행에만 중점을 두고 답변을 드린 것 같아 송구합니다.

문제 해결이 잘 되셨으면 좋겠습니다.

0

사탕

친절한 설명 감사드리며

정리하자면  무료버전인경우 @ServletComponentScan 이 있다면 provideRuntime 을 삭제해주면 된다는 거죠  사용은 gradle로 해야하느거구 실행이 지속되는거는 어쩔수 없는거구요

한글깨지는 문제는 utf-8로 해줫는데 왜 깨지는 걸 까요?

sername=hello

age=22

[��ü �Ķ���� ��ȸ] - end

[���� �Ķ���� ��ȸ]

request.getParameter(username) = hello

request.getParameter(age) = 22

[�̸��� ���� ���� �Ķ���� ��ȸ]

request.getParameterValues(username)

username=hello

username=hello2

2021-04-11 15:52:53.626 DEBUG 27944 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer      : Before fill(): [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position() [0]

2021-04-11 15:52:53.627 DEBUG 27944 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer      : Received []

2021-04-11 15:52:53.628 DEBUG 27944 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor   : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@7e6fa219:org.apache.tomcat.util.net.NioChannel@b19893f:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:1:59079]], Status in: [OPEN_READ], State out: [OPEN]

2021-04-11 15:52:53.766 DEBUG 27944 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Before fill(): [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position() [0]

2021-04-11 15:52:53.768 DEBUG 27944 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Received [GET /favicon.ico HTTP/1.1

Host: localhost:8080

Connection: keep-alive

sec-ch-ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"

sec-ch-ua-mobile: ?0

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36

Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: no-cors

Sec-Fetch-Dest: image

Referer: http://localhost:8080/request-param?username=hello&age=22&username=hello2

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

]

2021-04-11 15:52:53.776  INFO 27944 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'

2021-04-11 15:52:53.777  INFO 27944 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'

2021-04-11 15:52:53.780  INFO 27944 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms

2021-04-11 15:52:54.283 DEBUG 27944 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Before fill(): [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position() [0]

2021-04-11 15:52:54.284 DEBUG 27944 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer      : Received []

2021-04-11 15:52:54.285 DEBUG 27944 --- [nio-8080-exec-2] o.apache.coyote.http11.Http11Processor   : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@7e6fa219:org.apache.tomcat.util.net.NioChannel@b19893f:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:1:59079]], Status in: [OPEN_READ], State out: [OPEN]

0

Omnibus

1. 정리하자면  무료버전인경우 @ServletComponentScan 이 있다면 provideRuntime 을 삭제해주면 된다는 거죠  사용은 gradle로 해야하느거구 실행이 지속되는거는 어쩔수 없는거구요

→ 커뮤니티 에디션일 때 @ServletComponentScan이 있기 때문에 tomcat 의존성을 삭제하는 것은 아닙니다. 질문 내용을 정리해보자면, 첫 번째 질문처럼 프로젝트 실행 시 메인 메서드가 계속 유지되는 화면 때문에 실행을 IntelliJ IDEA로 변경했는데 이번엔 두 번째 질문처럼 실행이 안 되는 문제가 발생했으니, 추가적인 조치로 tomcat 의존성을 제거하시라고 말씀 드린 겁니다. 커뮤니티 에디션이라서 실행을 꼭 Gradle로 하실 필요는 없으며, IntelliJ IDEA 대신 Gradle로 하고 싶으시다면 실행을 Gradle로 설정하시고 tomcat 의존성을 유지하는 추가적인 옵션도 말씀 드린 거구요.

즉, 에러 발생 여부가 @ServletComponentScan 유무와는 상관이 없습니다. 다만 해당 어노테이션이 없다면 스프링이 서블릿을 자동으로 등록하지 않아 클라이언트 요청을 서블릿이 처리하지 못하겠죠(@ServletComponentScan은 제가 실행을 IntelliJ IDEA로 설정하고 tomcat 의존성을 지우지 않았는데도 두 번째 질문하신 에러가 발생하지 않았던 이유를 설명드리고자 언급한 것이었는데, 괜히 질문자님께서 이해하시는 데 혼란을 드린 거 같아서 죄송합니다). 결론적으로 Gradle을 통한 메인 메서드 실행이 유지되는 화면을 보는 걸 원하지 않으시면 실행은 IntelliJ IDEA, tomcat 의존성은 제거, 두 가지만 설정하시면 됩니다.

2. 한글 깨짐 문제

[��ü �Ķ���� ��ȸ] - end
[���� �Ķ���� ��ȸ]
request.getParameter(username) = hello
request.getParameter(age) = 22
[�̸��� ���� ���� �Ķ���� ��ȸ]

→ 한글을 출력하는 부분이 어디인지 몰라서 파악이 어려운데, 일단 프로젝트 및 파일 인코딩이 UTF-8로 잘 설정되어 있는지 확인해보시면 될 것 같습니다.

프로젝트 인코딩은 [Settings] - [Editor] - [File Encodings] 에서,

파일 인코딩은 파일을 여신 다음 우측 하단에서 확인 가능합니다.

1

Omnibus

안녕하세요, 사탕님.
IntelliJ에서 프로젝트 실행 시 Gradle을 통해서 실행되도록 설정이 되어 있는 것 같습니다.
해당 내용 관련 설정 방법의 출처는 영한님께서 정리하신 강의 자료 4~5페이지입니다.
아래 이미지대로 설정하시면 될 것 같습니다.
( 영한님 혹시 강의 자료 발췌와 관련하여 문제가 된다면 말씀해주시기 바랍니다.)



조금이나마 도움이 되었으면 좋겠습니다.

0

김영한

Omnibus님 최고!!

0

사탕

Idea로 하면 커뮤니티버전서는 에러가 나던데요

0

Omnibus

일단 저도 커뮤니티 에디션으로 테스트해보고 답변을 드렸는데, 혹시 어떤 에러가 발생하는지 캡쳐해서 보여주실 수 있나요?

0

사탕

"C:\Program Files\Java\jdk-11.0.2\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.2.2\lib\idea_rt.jar=53971:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.2.2\bin" -Dfile.encoding=UTF-8 -classpath C:\study\springmvc\servlet\out\production\classes;C:\study\springmvc\servlet\out\production\resources;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-web\2.4.4\8b84b6800a0b72d644d77aea3df0bf02008096a7\spring-boot-starter-web-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-json\2.4.4\3f9622c37d6ece1cbf5889aee688adbcc78ddeea\spring-boot-starter-json-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.4.4\5807f7ab098711f28d7d92c5986c6c5cfd82e996\spring-boot-starter-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-webmvc\5.3.5\449649af0eda09def9b5748bc8438253bf02f9f3\spring-webmvc-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-web\5.3.5\8233c67b3f33f619f6f8f34cc0f56e01a00e136e\spring-web-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jdk8\2.11.4\e1540dea3c6c681ea4e335a960f730861ee3bedb\jackson-datatype-jdk8-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jsr310\2.11.4\ce6fc76bba06623720e5a9308386b6ae74753f4d\jackson-datatype-jsr310-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.module\jackson-module-parameter-names\2.11.4\432e050d79f2282a66c320375d628f1b0842cb12\jackson-module-parameter-names-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-databind\2.11.4\5d9f3d441f99d721b957e3497f0a6465c764fad4\jackson-databind-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.4.4\6237b28c1bad51b175e5b91222292924322fda54\spring-boot-autoconfigure-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.4.4\38392ae406009e55efe873baee4633bfa6b766b3\spring-boot-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.4.4\4432cf056309ece02eb23417bc70f96b59ac8c24\spring-boot-starter-logging-2.4.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.5\633de7c79bfeccf05c81a0d4a32b3336010f06ab\spring-core-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.27\359d62567480b07a679dc643f82fc926b100eed5\snakeyaml-1.27.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.5\15166e945c1221016a534f1aa83bbddf992dba0a\spring-context-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.5\a52b30c37937ddb01585430bcc8442b2ac2a8b58\spring-aop-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.5\7604a458b0d8a47cdb113cf874c21c9750b53188\spring-beans-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.5\7149f94a2b134ffcd23cfd74f04ee1f1f2215347\spring-expression-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-core\2.11.4\593f7b18bab07a76767f181e2a2336135ce82cc4\jackson-core-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-annotations\2.11.4\2c3f5c079330f3a01726686a078979420f547ae4\jackson-annotations-2.11.4.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.3\7c4f3c474fb2c041d8028740440937705ebb473a\logback-classic-1.2.3.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.13.3\966f6fd1af4959d6b12bfa880121d4a2b164f857\log4j-to-slf4j-2.13.3.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.30\d58bebff8cbf70ff52b59208586095f467656c30\jul-to-slf4j-1.7.30.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.5\b4d8d3af78fb4e0f86534f75122e6896c37cf3f6\spring-jcl-5.3.5.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.3\864344400c3d4d92dfeb0a305dc87d953677c03c\logback-core-1.2.3.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.30\b5a4b6d16ab13e34a88fae84c35cd5d68cac922c\slf4j-api-1.7.30.jar;C:\Users\82109\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.13.3\ec1508160b93d274b1add34419b897bae84c6ca9\log4j-api-2.13.3.jar hello.servlet.ServletApplication

 

  .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v2.4.4)

 

2021-04-11 10:31:23.270  INFO 13264 --- [           main] hello.servlet.ServletApplication         : Starting ServletApplication using Java 11.0.2 on DESKTOP-C6Q38EP with PID 13264 (C:\study\springmvc\servlet\out\production\classes started by 82109 in C:\study\springmvc\servlet)

2021-04-11 10:31:23.279  INFO 13264 --- [           main] hello.servlet.ServletApplication         : No active profile set, falling back to default profiles: default

2021-04-11 10:31:24.588  WARN 13264 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet

2021-04-11 10:31:24.603  INFO 13264 --- [           main] ConditionEvaluationReportLoggingListener : 

 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

2021-04-11 10:31:24.655 ERROR 13264 --- [           main] o.s.boot.SpringApplication               : Application run failed

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletComponentRegisteringPostProcessor': Unexpected exception during bean creation; nested exception is java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:196) ~[spring-context-5.3.5.jar:5.3.5]

at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.5.jar:5.3.5]

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.5.jar:5.3.5]

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:769) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1313) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-2.4.4.jar:2.4.4]

at hello.servlet.ServletApplication.main(ServletApplication.java:12) ~[classes/:na]

Caused by: java.lang.NoClassDefFoundError: javax/servlet/annotation/WebServlet

at org.springframework.boot.web.servlet.WebServletHandler.<init>(WebServletHandler.java:39) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.web.servlet.ServletComponentRegisteringPostProcessor.<clinit>(ServletComponentRegisteringPostProcessor.java:49) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.boot.web.servlet.ServletComponentScanRegistrar$ServletComponentRegisteringPostProcessorBeanDefinition.lambda$getInstanceSupplier$0(ServletComponentScanRegistrar.java:94) ~[spring-boot-2.4.4.jar:2.4.4]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1231) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.5.jar:5.3.5]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.5.jar:5.3.5]

... 14 common frames omitted

Caused by: java.lang.ClassNotFoundException: javax.servlet.annotation.WebServlet

at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]

at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]

at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]

... 21 common frames omitted

 

 

Process finished with exit code 1

servlet과 container에 대한 질문입니다

0

15

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

59

1

jsp 의존성 수정 요청

0

72

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

141

1

save() 메서드 문의

0

62

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

98

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

92

1

RequestMapping을 이용한 핸들러, 어댑터

0

118

2

save 후 결과화면

0

86

2

jsp를 이용한 view

0

95

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

170

1

수업 코드 제공 관련 문의

0

95

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

96

3

파일 오픈 시

0

66

1

스프링 배치 관련

0

75

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

110

1

postman으로 /request-body-json-v1 호출시 500 error

0

93

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

74

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

110

1

console log 출력 관련 질문입니다.

0

73

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

135

1

html 변경하는 부분 적용 문제

0

98

1

한글 깨짐

0

72

2