29.4 내장된 서블릿 컨테이너 지원

Spring Boot는 임베디드 Tomcat, JettyUndertow 서버를 지원합니다. 대부분의 개발자는 적절한 "Starter"를 사용하여 완전히 구성된 인스턴스를 얻습니다. 기본적으로 내장 서버는 포트 8080에서 HTTP 요청을 수신합니다.

29.4.1 Servlets, Filters, and listeners

임베디드 서블릿 컨테이너를 사용할 때 스프링 빈을 사용하거나 서블릿 컴포넌트를 검색하여 서블릿, 필터 및 모든 리스너 (예 : HttpSessionListener)를 Servlet 스펙에서 등록 할 수 있습니다.

Registering Servlets, Filters, and Listeners as Spring Beans

모든 Servlet, Filter또는 Spring bean 인 서블릿 *Listener 인스턴스는 포함 된 컨테이너에 등록됩니다. 구성 중에 application.properties의 값을 참조하려는 경우 특히 유용 할 수 있습니다.

기본적으로 컨텍스트가 하나의 서블릿 만 포함하면 /에 매핑됩니다. 여러 서블릿 빈의 경우, 빈 이름이 경로 접두어로 사용됩니다. 필터는/*에 매핑됩니다.

컨벤션 기반 매핑이 충분히 유연하지 않으면 ServletRegistrationBean, FilterRegistrationBeanServletListenerRegistrationBean클래스를 사용하여 완벽한 제어가 가능합니다.

스프링부트에서는 web.xml 이 더 이상 사용되지 않아 서블릿이나 필터를 org.springframework.boot.web.servlet 의 RegistrationBean 을 통해 등록해야합니다.

필터와 달리 서블릿 등록은 특별한 경우가 아니면 추천하지 않는 방법이래!

Spring Boot는 Filter 빈을 정의 할 수있는 많은 자동 설정을 제공한다. 다음은 필터 및 각 광고 주문의 몇 가지 예입니다 (낮은 값은 우선 순위가 높음을 나타냄).

Servlet Filter

Order

OrderedCharacterEncodingFilter

Ordered.HIGHEST_PRECEDENCE

WebMvcMetricsFilter

Ordered.HIGHEST_PRECEDENCE + 1

ErrorPageFilter

Ordered.HIGHEST_PRECEDENCE + 1

HttpTraceFilter

Ordered.LOWEST_PRECEDENCE - 10

일반적으로 Filter Bean은 정렬되지 않은 상태로 두는 것이 안전합니다.

특정 순서가 필요한 경우 Ordered.HIGHEST_PRECEDENCE에서 요청 본문을 읽는 필터를 구성하지 마십시오. 응용 프로그램의 문자 인코딩 구성에 맞지 않을 수 있습니다. 서블릿 필터가 요청을 래핑하는 경우, 요청은 OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER보다 작거나 같은 순서로 구성되어야합니다.

29.4.2 서블릿 컨텍스트 초기화

임베디드 서블릿 컨테이너는 Servlet 3.0+ javax.servlet.ServletContainerInitializer 인터페이스 또는 스프링의 org.springframework.web.WebApplicationInitializer 인터페이스를 직접 실행하지 않습니다. 이는 전쟁 중에 실행되도록 설계된 타사 라이브러리가 Spring Boot 응용 프로그램을 손상시킬 수있는 위험을 줄이기위한 의도적인 설계 결정입니다.

Spring 부트 애플리케이션에서 서블릿 컨텍스트 초기화를 수행해야한다면, org.springframework.boot.web.servlet.ServletContextInitializer 인터페이스를 구현하는 빈을 등록해야한다. 단일 onStartup메소드는 ServletContext에 대한 액세스를 제공하며, 필요한 경우 기존 WebApplicationInitializer에 대한 어댑터로 쉽게 사용할 수 있습니다.

Scanning for Servlets, Filters, and listeners

포함 된 컨테이너를 사용할 때 @WebServlet, @WebFilterr 및 @WebListener로 주석 된 클래스의 자동 등록은 @ServletComponentScan을 사용하여 활성화 할 수 있습니다.

@ServletComponentScan은 컨테이너의 내장 검색 메커니즘이 대신 사용되는 독립형 컨테이너에는 아무런 영향을 미치지 않습니다.

29.4.3 The ServletWebServerApplicationContext

내부적으로 스프링 부트는 임베디드 서블릿 컨테이너 지원을 위해 다른 유형의 ApplicationContext를 사용합니다. ServletWebServerApplicationContext는 단일 ServletWebServerFactory빈을 검색하여 자체 부트 스트랩하는 특수 유형의 WebApplicationContext입니다. 보통 TomcatServletWebServerFactory, JettyServletWebServerFactory또는 UndertowServletWebServerFactory가 자동으로 구성되었습니다.

대개 이러한 구현 클래스를 인식 할 필요는 없습니다. 대부분의 응용 프로그램은 자동으로 구성되며 사용자를 대신하여 적절한 ApplicationContextServletWebServerFactory가 만들어집니다.

29.4.4 내장형 서블릿 컨테이너 사용자 정의

공통 서블릿 컨테이너 설정은 Spring Environment등록 정보를 사용하여 구성 할 수 있습니다. 일반적으로 application.properties 파일에서 속성을 정의합니다.

일반적인 서버 설정에는 다음이 포함됩니다.

  • 네트워크 설정 : 들어오는 HTTP 요청 (server.port), server.address에 바인드 할 인터페이스 주소 등을 수신합니다.

  • 세션 설정 : 세션이 지속적인지 여부 (server.servlet.session.persistence), 세션 시간 초과 (server.servlet.session.timeout), 세션 데이터 위치 (server.servlet.session.store-dir) 및 세션 쿠키 구성 (server.servlet.session.cookie.*).

  • 오류 관리 : 오류 페이지의 위치 (server.error.path).

스프링 부트 (Spring Boot)는 가능한 한 공통 설정을 노출하려고 시도하지만, 항상 가능하지는 않습니다. 이 경우, 전용 네임 스페이스는 서버 별 사용자 정의를 제공합니다 (server.tomcatserver.undertow 참조). 예를 들어 access logs는 임베디드 서블릿 컨테이너의 특정 기능으로 구성 될 수 있습니다.

전체 목록은 ServerProperties 클래스를 참조하십시오.

프로그래밍 방식의 사용자 정의

임베디드 서블릿 컨테이너를 프로그래밍 방식으로 구성해야하는 경우 WebServerFactoryCustomizer인터페이스를 구현하는 Spring bean을 등록 할 수 있습니다. WebServerFactoryCustomizer수많은 사용자 정의 설정 메소드를 포함하는 ConfigurableServletWebServerFactory에 대한 액세스를 제공합니다. 다음 예제에서는 프로그래밍 방식으로 포트를 설정하는 방법을 보여줍니다.

import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

	@Override
	public void customize(ConfigurableServletWebServerFactory server) {
		server.setPort(9000);
	}

}

TomcatServletWebServerFactory, JettyServletWebServerFactoryUndertowServletWebServerFactory는 Tomcat, Jetty 및 Undertow에 대한 추가 사용자 정의 설정 메소드가있는 ConfigurableServletWebServerFactory전용 변형입니다.

ConfigurableServletWebServerFactory의 직접 사용자 정의

이전의 사용자 정의 기술이 너무 제한적인 경우에는 TomcatServletWebServerFactory, JettyServletWebServerFactory또는 orUndertowServletWebServerFactory빈을 직접 등록 할 수 있습니다.

@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
	TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
	factory.setPort(9000);
	factory.setSessionTimeout(10, TimeUnit.MINUTES);
	factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
	return factory;
}

Setter는 많은 구성 옵션에 대해 제공됩니다. 좀 더 이국적인 것을해야 할 때 몇 가지 보호 된 방법 "hooks"도 제공됩니다. 자세한 내용은 source code documentation를 참조하십시오.

29.4.5 JSP 제한사항

임베디드 서블릿 컨테이너를 사용하는 (그리고 실행 가능한 아카이브로 패키지 된) Spring Boot 애플리케이션을 실행할 때, JSP 지원에는 몇 가지 제한이 있습니다.

  • Jetty와 Tomcat에서는 war 패키징을 사용하면 작동합니다. 실행 가능한 war은 java -jar로 시작될 때 작동하며 모든 표준 컨테이너에도 배포 할 수 있습니다. JSP는 실행 가능한 jar를 사용할 때 지원되지 않습니다.

  • Undertow는 JSP를 지원하지 않습니다.

  • 사용자 정의 error.jsp 페이지를 작성해도 error handling를 위한 기본 뷰가 대체되지 않습니다. 대신 Custom error pages를 사용해야합니다.

설정하는 방법을 볼 수있는 JSP sample이 있습니다.

Last updated