> For the complete documentation index, see [llms.txt](https://wannaqueen.gitbook.io/spring5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wannaqueen.gitbook.io/spring5/spring-boot/undefined-1/29./29.4.md).

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

**Spring Boot는 임베디드** [**Tomcat**](https://tomcat.apache.org/)**,** [**Jetty**](https://www.eclipse.org/jetty/) **및** [**Undertow**](https://github.com/undertow-io/undertow) **서버를 지원합니다.** 대부분의 개발자는 적절한 "Starter"를 사용하여 완전히 구성된 인스턴스를 얻습니다. **기본적으로 내장 서버는 포트 `8080`에서 HTTP 요청을 수신합니다.**&#x20;

#### 29.4.1 Servlets, Filters, and listeners

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

**Registering Servlets, Filters, and Listeners as Spring Beans**

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

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

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

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

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

![](/files/-LgI_VFeFVtwCWuIeIkz)

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

| Servlet Filter                   | Order                            |
| -------------------------------- | -------------------------------- |
| `OrderedCharacterEncodingFilter` | `Ordered.HIGHEST_PRECEDENCE`     |
| `WebMvcMetricsFilter`            | `Ordered.HIGHEST_PRECEDENCE + 1` |
| `ErrorPageFilter`                | `Ordered.HIGHEST_PRECEDENCE + 1` |
| `HttpTraceFilter`                | `Ordered.LOWEST_PRECEDENCE - 10` |

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

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

#### 29.4.2 서블릿 컨텍스트 초기화

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

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

**Scanning for Servlets, Filters, and listeners**

포함 된 컨테이너를 사용할 때 **`@WebServlet`, `@WebFilter`r 및 `@WebListener`로 주석 된 클래스의 자동 등록은 `@ServletComponentScan`**&#xC744; 사용하여 활성화 할 수 있습니다.&#x20;

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png) |
| ----------------------------------------------------------------------------------------------- |
| `@ServletComponentScan`은 컨테이너의 내장 검색 메커니즘이 대신 사용되는 독립형 컨테이너에는 아무런 영향을 미치지 않습니다.                 |
|                                                                                                 |

#### 29.4.3 The ServletWebServerApplicationContext

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

| ![\[Note\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                            |
| ---------------------------------------------------------------------------------------------------------------------------- |
| 대개 이러한 구현 클래스를 인식 할 필요는 없습니다. 대부분의 응용 프로그램은 자동으로 구성되며 사용자를 대신하여 적절한 `ApplicationContext`및 `ServletWebServerFactory`가 만들어집니다. |

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

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

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

* 네트워크 설정 : 들어오는 HTTP 요청 (`server.port`), `server.address`에 바인드 할 인터페이스 주소 등을 수신합니다.&#x20;
* 세션 설정 : 세션이 지속적인지 여부 (`server.servlet.session.persistence`), 세션 시간 초과 (`server.servlet.session.timeout`), 세션 데이터 위치 (`server.servlet.session.store-dir`) 및 세션 쿠키 구성 (`server.servlet.session.cookie.*`).&#x20;
* 오류 관리 : 오류 페이지의 위치 (`server.error.path`).&#x20;
* [SSL](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-ssl)
* [HTTP compression](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#how-to-enable-http-response-compression)

스프링 부트 (Spring Boot)는 가능한 한 공통 설정을 노출하려고 시도하지만, 항상 가능하지는 않습니다. 이 경우, 전용 네임 스페이스는 서버 별 사용자 정의를 제공합니다 (`server.tomcat` 및 `server.undertow` 참조). 예를 들어 [access logs](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-accesslogs)는 임베디드 서블릿 컨테이너의 특정 기능으로 구성 될 수 있습니다.&#x20;

| ![\[Tip\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                                                                                                                                           |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 전체 목록은 [`ServerProperties`](https://github.com/spring-projects/spring-boot/tree/v2.1.5.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java) 클래스를 참조하십시오. |

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

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

```java
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);
	}

}
```

| ![\[Note\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TomcatServletWebServerFactory`, `JettyServletWebServerFactory`및 `UndertowServletWebServerFactory`는 Tomcat, Jetty 및 Undertow에 대한 추가 사용자 정의 설정 메소드가있는 `ConfigurableServletWebServerFactory`전용 변형입니다. |

**ConfigurableServletWebServerFactory의 직접 사용자 정의**&#x20;

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

```java
@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](https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/api/org/springframework/boot/web/servlet/server/ConfigurableServletWebServerFactory.html)를 참조하십시오.

#### 29.4.5 JSP 제한사항&#x20;

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

* Jetty와 Tomcat에서는 war 패키징을 사용하면 작동합니다. 실행 가능한 war은 `java -jar`로 시작될 때 작동하며 모든 표준 컨테이너에도 배포 할 수 있습니다. JSP는 실행 가능한 jar를 사용할 때 지원되지 않습니다.
* Undertow는 JSP를 지원하지 않습니다.
* 사용자 정의 `error.jsp` 페이지를 작성해도 [error handling](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling)를 위한 기본 뷰가 대체되지 않습니다. 대신 [Custom error pages](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling-custom-error-pages)를 사용해야합니다.&#x20;

설정하는 방법을 볼 수있는 [JSP sample](https://github.com/spring-projects/spring-boot/tree/v2.1.5.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp)이 있습니다.&#x20;
