# 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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wannaqueen.gitbook.io/spring5/spring-boot/undefined-1/29./29.4.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
