스프링 부트 #9.“How-to” Guides (1)
9.“방법”안내서
이 섹션에서는 Spring Boot를 사용할 때 자주 발생하는 일반적인 '어떻게해야합니까?' 그것의 적용 범위는 완전하지는 않지만 꽤 많이 포함됩니다.
여기서 다루지 않은 특정 문제가있는 경우 stackoverflow.com 을 확인하여 누군가가 이미 답변을 제공했는지 확인할 수 있습니다 . 새로운 질문을하기에도 좋은 장소입니다 ( spring-boot
태그 를 사용하십시오 ).
또한이 섹션을 확장하게되어 기쁩니다. '방법'을 추가하려면 pull request를 보내주십시오 .
9.1. 스프링 부트 어플리케이션
이 섹션에는 Spring Boot 애플리케이션과 직접 관련된 주제가 포함되어 있습니다.
9.1.1. 자신 만의 FailureAnalyzer 만들기
FailureAnalyzer
시작시 예외를 가로 채서이를 읽을 수있는 사람이 읽을 수있는 메시지로 바꾸는 좋은 방법 FailureAnalysis
입니다. Spring Boot는 애플리케이션 컨텍스트 관련 예외, JSR-303 유효성 검사 등에 대한 분석기를 제공합니다. 당신은 또한 자신을 만들 수 있습니다.
AbstractFailureAnalyzer
FailureAnalyzer
처리 할 예외에 지정된 예외 유형이 있는지 확인 하는 편리한 확장입니다 . 구현에서 예외가 실제로 존재하는 경우에만 예외를 처리 할 수 있도록 확장 할 수 있습니다. 어떤 이유로 든 예외를 처리 할 수없는 경우, null
다른 구현에서 예외를 처리 할 기회를주기 위해 리턴 하십시오.
FailureAnalyzer
구현은에 등록해야합니다 META-INF/spring.factories
. 다음 예제는 등록합니다 ProjectConstraintViolationFailureAnalyzer
.
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
당신은에 액세스해야하는 경우 BeanFactory 또는를 Environment , 당신의 FailureAnalyzer 캔은 단순히 구현 BeanFactoryAware 또는 EnvironmentAware 각각. |
9.1.2. 자동 구성 문제 해결
스프링 부트 자동 설정은 "올바른 일을하기"위해 최선을 다하지만 때로는 실패하기도하며 그 이유를 말하기가 어려울 수 있습니다.
ConditionEvaluationReport
모든 Spring Boot에서 실제로 유용한 기능이 있습니다 ApplicationContext
. DEBUG
로깅 출력 을 사용하면 볼 수 있습니다 . spring-boot-actuator
( 액추에이터 장 참조) 을 사용하는 경우 conditions
보고서를 JSON으로 렌더링 하는 엔드 포인트 도 있습니다 . 해당 엔드 포인트를 사용하여 애플리케이션을 디버그하고 런타임시 Spring Boot가 추가 한 기능과 추가되지 않은 기능을 확인하십시오.
소스 코드와 Javadoc을 보면 더 많은 질문에 대답 할 수 있습니다. 코드를 읽을 때 다음과 같은 경험 법칙을 기억하십시오.
- 호출 된 클래스를 찾아서
*AutoConfiguration
소스를 읽으십시오.@Conditional*
어떤 기능을 언제 사용할 수 있는지 알아 보려면 주석에 특별한주의를 기울이십시오 . 추가--debug
명령 줄이나 시스템 속성에-Ddebug
앱에서 수행 된 모든 자동 구성 결정의 콘솔에 로그를 얻을 수 있습니다. 액추에이터가 활성화 된 실행중인 애플리케이션 에서 동일한 정보에 대한conditions
엔드 포인트 (/actuator/conditions
또는 JMX 동등 항목)를보십시오. @ConfigurationProperties
와 같은 클래스를 찾고ServerProperties
사용 가능한 외부 구성 옵션을 읽습니다.@ConfigurationProperties
주석은가name
외부 속성의 접두사 역할 속성을. 따라서,ServerProperties
이prefix="server"
와 그 설정 속성은server.port
,server.address
, 등이있다. 액추에이터가 활성화 된 실행중인 애플리케이션에서configprops
엔드 포인트를보십시오.- 의 용도 봐
bind
온 방법은Binder
명시 적으로 밖으로 구성 값을 당겨Environment
편안한 방식으로. 접두사와 함께 자주 사용됩니다. - 에
@Value
직접 바인딩되는 주석을 찾으 십시오Environment
. @ConditionalOnExpression
SpEL 표현식에 대한 응답으로 기능을 켜고 끄는 주석을 찾으십시오 . 일반적으로에서 자리 표시자를 사용하여 평가합니다Environment
.
9.1.3. 시작하기 전에 환경 또는 ApplicationContext 사용자 정의
A는 SpringApplication
가지고 ApplicationListeners
와 ApplicationContextInitializers
그는 상황이나 환경에 사용자 정의를 적용하는 데 사용됩니다. Spring Boot는에서 내부적으로 사용하기 위해 이러한 많은 사용자 정의를로드합니다 META-INF/spring.factories
. 추가 사용자 정의를 등록하는 방법은 여러 가지가 있습니다.
- 실행하기 전에
addListeners
및addInitializers
메소드를 호출하여 애플리케이션별로 프로그래밍 방식으로SpringApplication
. context.initializer.classes
또는context.listener.classes
속성 을 설정하여 애플리케이션별로 선언적으로 .- 선언적으로 모든 응용 프로그램
META-INF/spring.factories
에서 응용 프로그램이 모두 라이브러리로 사용하는 jar 파일을 추가 하고 패키징합니다.
이 SpringApplication
메소드 ApplicationEvents
는 리스너에게 특별한 내용 을 보내고 (일부는 컨텍스트가 작성되기 전에도) 리스너가 공개 한 이벤트에 대한 리스너를 등록합니다 ApplicationContext
. 전체 목록은 '스프링 부팅 기능'섹션의 “ 응용 프로그램 이벤트 및 리스너 ”를 참조하십시오 .
Environment
를 사용하여 응용 프로그램 컨텍스트를 새로 고치기 전에 를 사용자 정의 할 수도 있습니다 EnvironmentPostProcessor
. META-INF/spring.factories
다음 예제와 같이 각 구현은에 등록해야합니다 .
org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor
구현은 임의의 파일을로드하여에 추가 할 수 있습니다 Environment
. 예를 들어 다음 예제는 클래스 경로에서 YAML 구성 파일을로드합니다.
public class EnvironmentPostProcessorExample implements EnvironmentPostProcessor {
private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Resource path = new ClassPathResource("com/example/myapp/config.yml");
PropertySource<?> propertySource = loadYaml(path);
environment.getPropertySources().addLast(propertySource);
}
private PropertySource<?> loadYaml(Resource path) {
if (!path.exists()) {
throw new IllegalArgumentException("Resource " + path + " does not exist");
}
try {
return this.loader.load("custom-resource", path).get(0);
}
catch (IOException ex) {
throw new IllegalStateException("Failed to load yaml configuration from " + path, ex);
}
}
}
은 Environment 이미 기본적으로 스프링 부트로드 모든 일반적인 속성 소스와 함께 준비되었습니다. 따라서 환경에서 파일의 위치를 얻을 수 있습니다. 앞의 예제는 custom-resource 일반적인 다른 위치에 정의 된 키가 우선하도록 목록 끝에 속성 소스를 추가합니다 . 사용자 정의 구현은 다른 순서를 정의 할 수 있습니다. |
에 사용 @PropertySource 하는 @SpringBootApplication 것이 사용자 지정 리소스를에로드하는 편리한 방법 인 것처럼 보이지만 Environment 권장하지는 않습니다. 이러한 속성 소스는 Environment 응용 프로그램 컨텍스트를 새로 고칠 때까지에 추가되지 않습니다 . 이것은 너무 늦게과 같은 구성 특정 속성입니다 logging.* 및 spring.main.* 새로 고침이 시작되기 전에 읽습니다. |
9.1.4. ApplicationContext 계층 만들기 (부모 또는 루트 컨텍스트 추가)
ApplicationBuilder
클래스를 사용하여 부모 / 자식 ApplicationContext
계층 을 만들 수 있습니다 . 자세한 내용 은 '스프링 부팅 기능'섹션의 “ Fluent Builder API ”를 참조하십시오.
9.1.5. 웹 이외의 응용 프로그램 만들기
모든 Spring 애플리케이션이 웹 애플리케이션 (또는 웹 서비스) 일 필요는 없습니다. main
메소드 에서 일부 코드를 실행 하고 Spring 애플리케이션을 부트 스트랩하여 사용할 인프라를 설정하려는 경우 SpringApplication
Spring Boot 의 기능을 사용할 수 있습니다 . A 는 웹 응용 프로그램이 필요한지 여부에 따라 클래스를 SpringApplication
변경합니다 ApplicationContext
. 이를 돕기 위해 할 수있는 첫 번째 일은 서버 관련 종속성 (예 : 서블릿 API)을 클래스 경로에 두지 않는 것입니다. 이를 수행 할 수없는 경우 (예를 들어, 동일한 코드 기반에서 두 개의 애플리케이션을 실행하는 경우) 인스턴스를 명시 적으로 호출 하거나setWebApplicationType(WebApplicationType.NONE)
에 놓을 수 있습니다SpringApplication
applicationContextClass
(외부 속성 자바 API를 통해 또는과) 속성을. 비즈니스 로직으로 실행하려는 애플리케이션 코드는CommandLineRunner
@Bean
정의 로 컨텍스트에 떨어졌습니다 .
9.2. 속성 및 구성
이 섹션에는 속성 설정 및 설정과 구성 설정 및 Spring Boot 응용 프로그램과의 상호 작용에 대한 주제가 포함되어 있습니다.
9.2.1. 빌드시 속성 자동 확장
프로젝트의 빌드 구성에도 지정된 일부 속성을 하드 코딩하는 대신 기존 빌드 구성을 사용하여 자동으로 확장 할 수 있습니다. 이것은 Maven과 Gradle에서 가능합니다.
Maven을 사용한 자동 속성 확장
리소스 필터링을 사용하여 Maven 프로젝트에서 속성을 자동으로 확장 할 수 있습니다. 를 사용하는 경우 다음 예제와 같이 자리 표시 자 spring-boot-starter-parent
와 함께 Maven '프로젝트 속성'을 참조 할 수 있습니다 @..@
.
app.encoding=@project.build.sourceEncoding@
app.java.version=@java.version@
프로덕션 구성 만 필터링됩니다 (즉,에 필터링이 적용되지 않음 src/test/resources ). |
addResources 플래그 를 사용하면 spring-boot:run 목표를 src/main/resources 클래스 경로 에 직접 추가 할 수 있습니다 (핫 리로드 목적). 그렇게하면 리소스 필터링과이 기능이 우회됩니다. 대신 exec:java 목표를 사용 하거나 플러그인 구성을 사용자 정의 할 수 있습니다 . 자세한 내용은 플러그인 사용 페이지 를 참조하십시오. |
시작 부모를 사용하지 않는 경우 요소의 내부에 다음 요소를 포함시켜야 <build/>
합니다 pom.xml
.
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
또한 다음 요소를 내부에 포함시켜야합니다 <plugins/>
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
useDefaultDelimiters 당신은 표준 스프링 자리를 (예 : 사용하는 경우 속성은 중요 ${placeholder} 구성에서). 해당 속성이로 설정되어 있지 않으면 false 빌드로 확장 될 수 있습니다. |
Gradle을 사용한 자동 속성 확장
processResources
다음 예제와 같이 Java 플러그인 작업을 구성하여 Gradle 프로젝트에서 속성을 자동으로 확장 할 수 있습니다 .
processResources {
expand(project.properties)
}
그런 다음 다음 예제와 같이 자리 표시자를 사용하여 Gradle 프로젝트의 속성을 참조 할 수 있습니다.
app.name=${name}
app.description=${description}
Gradle의 expand 방법은 Groovy를 사용하여 토큰 SimpleTemplateEngine 을 변환 ${..} 합니다. 이 ${..} 스타일은 Spring의 자체 속성 자리 표시 자 메커니즘과 충돌합니다. Spring 특성 플레이스 홀더를 자동 확장과 함께 사용하려면 다음과 같이 Spring 특성 플레이스 홀더를 피하십시오 \${..} . |
9.2.2. SpringApplication의 구성을 외부화
A SpringApplication
에는 Bean 특성 (주로 세터)이 있으므로 애플리케이션을 작성할 때 Java API를 사용하여 동작을 수정할 수 있습니다. 또는의 속성을 설정하여 구성을 외부화 할 수 있습니다 spring.main.*
. 예를 들어 application.properties
에서 다음과 같은 설정이있을 수 있습니다.
spring.main.web-application-type=none
spring.main.banner-mode=off
그런 다음 시작시 Spring Boot 배너가 인쇄되지 않고 응용 프로그램이 내장 웹 서버를 시작하지 않습니다.
외부 구성에 정의 된 특성은 Java API로 지정된 값을 대체합니다. 단, 소스를 작성하는 데 사용 된 소스는 예외입니다 ApplicationContext
. 다음 응용 프로그램을 고려하십시오.
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(demo.MyApp.class)
.run(args);
이제 다음 구성을 고려하십시오.
spring.main.sources=com.acme.Config,com.acme.ExtraConfig
spring.main.banner-mode=console
실제 응용 프로그램은 이제 배너를 보여줍니다 (구성에 의해 무시로)와 세 가지 소스를 사용합니다 ApplicationContext
(다음 순서대로) : demo.MyApp
, com.acme.Config
,와 com.acme.ExtraConfig
.
9.2.3. 응용 프로그램의 외부 속성 위치 변경
기본적으로 다른 소스의 속성 Environment
이 정의 된 순서로 Spring 에 추가됩니다 ( 정확한 순서는 '스프링 부팅 기능'섹션의 " 외부화 된 구성 " 참조 ).
다음 시스템 특성 (또는 환경 변수)을 제공하여 동작을 변경할 수도 있습니다.
spring.config.name
(SPRING_CONFIG_NAME
) :application
파일 이름의 루트가 기본값 입니다.spring.config.location
(SPRING_CONFIG_LOCATION
) :로드 할 파일 (예 : 클래스 경로 리소스 또는 URL)Environment
이 문서에 대해 별도의 속성 소스가 설정되며 시스템 속성, 환경 변수 또는 명령 줄로 재정의 할 수 있습니다.
환경에서 설정 한 내용에 상관없이 Spring Boot는 항상 application.properties
위에서 설명한대로 로드 됩니다. 기본적으로 YAML을 사용하면 확장자가 '.yml'인 파일도 목록에 추가됩니다.
Spring Boot는 DEBUG
레벨 에서로드 된 구성 파일 과 TRACE
레벨 에서 찾을 수없는 후보를 기록 합니다.
자세한 내용 ConfigFileApplicationListener
은 참조하십시오 .
9.2.4. '짧은'명령 줄 인수 사용
일부 사람들 은 명령 줄에서 구성 속성을 설정하는 --port=9000
대신 (예를 들어) 사용하는 --server.port=9000
것을 좋아합니다 . application.properties
다음 예제와 같이에서 자리 표시자를 사용하여이 동작을 활성화 할 수 있습니다 .
server.port=${port:8080}
당신은에서 상속하는 경우 spring-boot-starter-parent POM,의 토큰 기본 필터가 maven-resources-plugins 변경되었습니다 ${*} 에 @ (이라고 @maven.token@ 대신 ${maven.token} 봄 스타일의 자리와의 충돌을 방지하기 위해). Maven 필터링을 application.properties 직접 활성화 한 경우 다른 구분 기호 를 사용하도록 기본 필터 토큰을 변경할 수도 있습니다 . |
이 경우 포트 바인딩은 Heroku 또는 Cloud Foundry와 같은 PaaS 환경에서 작동합니다. 이 두 플랫폼에서 PORT 환경 변수는 자동으로 설정되며 Spring은 Environment 속성에 대한 대문자 동의어에 바인딩 할 수 있습니다. |
9.2.5. 외부 속성에 YAML 사용
YAML은 JSON의 상위 집합이므로 다음 예제와 같이 외부 속성을 계층 형식으로 저장하기위한 편리한 구문입니다.
spring:
application:
name: cruncher
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/test
server:
port: 9000
라는 파일 application.yml
을 만들어 클래스 경로의 루트에 넣습니다. 그런 다음 snakeyaml
종속성에 추가 하십시오 (Maven coordinates org.yaml:snakeyaml
, 이미 사용하는 경우 포함 spring-boot-starter
). YAML 파일은 Map<String,Object>
JSON 객체와 같은 Java로 구문 분석 되고 Spring Boot는 맵을 평평하게하여 한 단계 깊고 기간 분리 키를 갖습니다. 많은 사람들이 Properties
Java 파일에 익숙하기 때문입니다 .
위의 예제 YAML은 다음 application.properties
파일에 해당 합니다.
spring.application.name=cruncher
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
server.port=9000
YAML에 대한 자세한 내용은 '스프링 부팅 기능'섹션의“ 속성 대신 YAML 사용 ”을 참조하십시오 .
9.2.6. 활성 스프링 프로파일 설정
Spring Environment
에는이를위한 API가 있지만 일반적으로 시스템 특성 ( spring.profiles.active
) 또는 OS 환경 변수 ( SPRING_PROFILES_ACTIVE
)를 설정합니다. 또한 다음과 같이 -D
인수를 사용 하여 응용 프로그램을 시작할 수 있습니다 (기본 클래스 또는 jar 아카이브 앞에 두어야 함).
$ java -jar -Dspring.profiles.active = production 데모 -0.0.1-SNAPSHOT.jar
Spring Boot application.properties
에서 다음 예제와 같이에서 활성 프로파일을 설정할 수도 있습니다 .
spring.profiles.active=production
이 방법으로 설정 한 값은 시스템 속성 또는 환경 변수 설정으로 바뀌지 만 SpringApplicationBuilder.profiles()
메서드는 아닙니다 . 따라서 후자의 Java API를 사용하여 기본값을 변경하지 않고 프로파일을 기능 보강 할 수 있습니다.
자세한 내용 은“스프링 부팅 기능”섹션의 “ 프로필 ”을 참조하십시오.
9.2.7. 환경에 따라 구성 변경
YAML 파일은 실제로 ---
줄로 구분 된 일련의 문서 이며 각 문서는 병합 된 맵으로 개별적으로 구문 분석됩니다.
YAML 문서에 spring.profiles
키 가 포함되어 있으면 프로파일 값 (쉼표로 구분 된 프로파일 목록)이 Spring Environment.acceptsProfiles()
메소드에 제공됩니다. 해당 프로필 중 하나라도 활성화되어 있으면 다음 예제와 같이 해당 문서가 최종 병합에 포함됩니다 (그렇지 않은 경우).
server:
port: 9000
---
spring:
profiles: development
server:
port: 9001
---
spring:
profiles: production
server:
port: 0
앞의 예에서 기본 포트는 9000입니다. 그러나 'development'라는 스프링 프로파일이 활성화 된 경우 포트는 9001입니다. 'production'이 활성화 된 경우 포트는 0입니다.
YAML 문서는 발생한 순서대로 병합됩니다. 이후 값은 이전 값보다 우선합니다. |
특성 파일과 동일한 작업을 수행하기 application-${profile}.properties
위해 프로파일 특정 값을 지정 하는 데 사용할 수 있습니다 .
9.2.8. 외부 속성에 대한 내장 옵션 검색
Spring Boot 는 런타임 에 외부 속성 application.properties
(또는 .yml
파일 및 기타 장소)을 응용 프로그램에 바인딩 합니다. 클래스 경로의 추가 jar 파일에서 기여할 수 있기 때문에 단일 위치에 지원되는 모든 특성의 전체 목록이없고 기술적으로도 완전한 목록이 없습니다.
Actuator 기능이있는 실행중인 응용 프로그램 configprops
에는를 통해 사용 가능한 모든 바인딩 및 바인딩 가능한 속성을 표시 하는 엔드 포인트가 있습니다 @ConfigurationProperties
.
부록에는 application.properties
Spring Boot에서 지원하는 가장 일반적인 속성 목록이 포함 된 예가 포함되어 있습니다. 결정적인 목록은 소스 코드 @ConfigurationProperties
와 @Value
주석 을 검색 하고 가끔 사용하는 것입니다 Binder
. 로드 속성의 정확한 순서에 대한 자세한 내용은 " 외부화 된 구성 "을 참조하십시오 .
9.3. 내장 웹 서버
각 Spring Boot 웹 애플리케이션에는 내장 웹 서버가 포함되어 있습니다. 이 기능은 내장 서버를 변경하는 방법 및 내장 서버를 구성하는 방법을 포함하여 여러 가지 방법 질문으로 이어집니다. 이 섹션은 이러한 질문에 대한 답변입니다.
9.3.1. 다른 웹 서버 사용
많은 Spring Boot 스타터에는 기본 내장 컨테이너가 포함되어 있습니다.
- 서블릿 스택 응용 프로그램의 경우는
spring-boot-starter-web
포함하여 Tomcat을 포함spring-boot-starter-tomcat
,하지만 당신은 사용할 수 있습니다spring-boot-starter-jetty
또는spring-boot-starter-undertow
대신. - 반응 스택 응용 프로그램의 경우는
spring-boot-starter-webflux
포함하여 원자로 인 Netty를 포함spring-boot-starter-reactor-netty
,하지만 당신은 사용할 수 있습니다spring-boot-starter-tomcat
,spring-boot-starter-jetty
또는spring-boot-starter-undertow
대신.
다른 HTTP 서버로 전환 할 때 필요한 것을 포함 할뿐만 아니라 기본 종속성도 제외해야합니다. Spring Boot는 HTTP 서버를위한 별도의 스타터를 제공하여이 프로세스를 가능한 한 쉽게 만듭니다.
다음 Maven 예제는 Tomcat을 제외하고 Jetty for Spring MVC를 포함하는 방법을 보여줍니다.
<properties>
<servlet-api.version>3.1.0</servlet-api.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Tomcat 9 및 Undertow 2.0과 달리 Servlet API의 버전은 Jetty 9.4가 Servlet 4.0을 지원하지 않기 때문에 재정의되었습니다. |
다음 Gradle 예제는 Netty를 제외하고 Spring WebFlux에 대한 Undertow를 포함하는 방법을 보여줍니다.
dependencies {
implementation('org.springframework.boot:spring-boot-starter-webflux') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-reactor-netty'
}
// Use Undertow instead
implementation 'org.springframework.boot:spring-boot-starter-undertow'
// ...
}
spring-boot-starter-reactor-netty WebClient 클래스 를 사용해야 하므로 다른 HTTP 서버를 포함해야하는 경우에도 Netty에 대한 종속성을 유지해야 할 수도 있습니다. |
9.3.2. 웹 서버 비활성화
클래스 경로에 웹 서버를 시작하는 데 필요한 비트가 포함되어 있으면 Spring Boot가 자동으로 시작합니다. 이 동작은을 구성하지 않으려면 WebApplicationType
당신의 application.properties
다음 예제와 같이 :
spring.main.web-application-type=none
9.3.3. HTTP 포트 변경
독립형 응용 프로그램에서 기본 HTTP 포트는 기본적 8080
으로 설정되지만이를 사용하여 server.port
(예 application.properties
: 시스템 특성으로 또는 시스템 특성으로) 설정할 수 있습니다 . 완화 된 Environment
값 바인딩 덕분에 SERVER_PORT
(예 : OS 환경 변수) 사용할 수도 있습니다 .
HTTP 엔드 포인트를 완전히 끄고 여전히을 작성 하려면를 WebApplicationContext
사용하십시오 server.port=-1
(이 작업은 테스트에 유용 할 수 있습니다).
자세한 내용 은 '스프링 부팅 기능'섹션의 " 내장 서블릿 컨테이너 사용자 정의 "또는 ServerProperties
소스 코드를 참조하십시오.
9.3.4. 임의의 할당되지 않은 HTTP 포트 사용
사용 가능한 포트를 스캔하려면 (충돌을 방지하기 위해 OS 고유 사용)을 사용하십시오 server.port=0
.
9.3.5. 런타임시 HTTP 포트 발견
당신은 로그 출력에서 서버가 실행중인 포트를 액세스하거나에서 수 ServletWebServerApplicationContext
의를 통해 WebServer
. 이를 얻고 초기화되었는지 확인하는 가장 좋은 방법 @Bean
은 유형 을 추가 ApplicationListener<ServletWebServerInitializedEvent>
하고 이벤트가 게시 될 때 컨테이너를 꺼내는 것입니다.
사용하는 테스트 는 다음 예제와 같이 주석 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
을 사용하여 실제 포트를 필드에 삽입 할 수도 있습니다 @LocalServerPort
.
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class MyWebIntegrationTests {
@Autowired
ServletWebServerApplicationContext server;
@LocalServerPort
int port;
// ...
}
|
9.3.6. HTTP 응답 압축 사용
HTTP 응답 압축은 Jetty, Tomcat 및 Undertow에서 지원됩니다. application.properties
다음과 같이 에서 활성화 할 수 있습니다 .
server.compression.enabled=true
압축을 수행하려면 기본적으로 응답 길이가 2048 바이트 이상이어야합니다. server.compression.min-response-size
속성 을 설정하여이 동작을 구성 할 수 있습니다 .
기본적으로 응답은 컨텐츠 유형이 다음 중 하나 인 경우에만 압축됩니다.
text/html
text/xml
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
server.compression.mime-types
속성 을 설정하여이 동작을 구성 할 수 있습니다 .
9.3.7. SSL 구성
SSL은 server.ssl.*
일반적으로 application.properties
또는 에서 다양한 속성 을 설정하여 선언적으로 구성 할 수 있습니다 application.yml
. 다음 예제는 SSL 특성 설정을 보여줍니다 application.properties
.
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret
보다 Ssl
지원되는 모든 속성에 대한 자세한 내용을 .
앞의 예제와 같은 구성을 사용한다는 것은 응용 프로그램이 포트 8080에서 더 이상 일반 HTTP 커넥터를 지원하지 않음을 의미합니다. Spring Boot는를 통한 HTTP 커넥터와 HTTPS 커넥터의 구성을 지원하지 않습니다 application.properties
. 두 가지를 모두 사용하려면 프로그래밍 방식으로 구성해야합니다. 우리는 사용하는 것이 좋습니다application.properties
HTTP 커넥터는 두 가지 중에서 프로그래밍 방식으로 구성하기가 더 쉽기 때문에 HTTPS 구성에 하는 .
9.3.8. HTTP / 2 구성
server.http2.enabled
구성 특성을 사용하여 Spring Boot 애플리케이션에서 HTTP / 2 지원을 사용할 수 있습니다 . 이 지원은 선택한 웹 서버 및 응용 프로그램 환경에 따라 다릅니다. 해당 프로토콜은 JDK8에서 기본적으로 지원되지 않기 때문입니다.
Spring Boot는 |
Undertow를 사용하는 HTTP / 2
Undertow 1.4.0 이상에서 JDK8에 대한 추가 요구 사항없이 HTTP / 2가 지원됩니다.
부두와 HTTP / 2
Jetty 9.4.8부터 Conscrypt 라이브러리 에서도 HTTP / 2가 지원됩니다 . 이 지원을 사용하려면 응용 프로그램이 두 개의 추가 종속성이 필요 : org.eclipse.jetty:jetty-alpn-conscrypt-server
와 org.eclipse.jetty.http2:http2-server
.
Tomcat을 사용하는 HTTP / 2
Spring Boot는 기본적으로 JDK 9 이상을 사용할 때 기본적으로 HTTP / 2를 지원하는 Tomcat 9.0.x와 함께 제공됩니다. 또는 libtcnative
라이브러리 및 해당 종속 항목이 호스트 운영 체제에 설치된 경우 JDK 8에서 HTTP / 2를 사용할 수 있습니다 .
라이브러리 디렉토리는 아직 JVM 라이브러리 경로에 사용 가능해야합니다. 와 같은 JVM 인수로이를 수행 할 수 있습니다 -Djava.library.path=/usr/local/opt/tomcat-native/lib
. 이에 대한 자세한 내용은 공식 Tomcat 설명서를 참조하십시오 .
기본 지원없이 JDK 8에서 Tomcat 9.0.x를 시작하면 다음 오류가 기록됩니다.
오류 8787 --- [main] oacoyote.http11.Http11NioProtocol : [h2]의 업그레이드 처리기 [org.apache.coyote.http2.Http2Protocol]는 ALPN을 통한 업그레이드 만 지원하지만 [ "https-jsse-nio에 대해 구성되었습니다. ALPN을 지원하지 않는 -8443 "] 커넥터.
이 오류는 치명적이지 않으며 응용 프로그램은 여전히 HTTP / 1.1 SSL 지원으로 시작합니다.
반응기 리티가있는 HTTP / 2
는 spring-boot-webflux-starter
서버로 기본 원자로의 Netty로 사용하고 있습니다. JDK 9 이상에서 JDK 지원을 사용하여 Reactor Netty를 HTTP / 2로 구성 할 수 있습니다. JDK 8 환경 또는 최적의 런타임 성능을 위해이 서버는 기본 라이브러리와 함께 HTTP / 2도 지원합니다. 이를 가능하게하려면 응용 프로그램에 추가 종속성이 있어야합니다.
Spring Boot는 io.netty:netty-tcnative-boringssl-static
모든 플랫폼에 대한 기본 라이브러리를 포함 하는 "uber jar" 버전을 관리합니다 . 개발자는 분류기를 사용하여 필요한 종속성 만 가져 오도록 선택할 수 있습니다 ( Netty 공식 문서 참조 ).
9.3.9. 웹 서버 구성
일반적으로, 먼저 사용할 수있는 많은 구성 키 중 하나를 사용하는 것을 고려하고 새로운 항목을 추가하여 웹 서버를 사용자 정의해야합니다 application.properties
(또는 application.yml
표시 등, 또는 환경 " 발견 내장 외부 속성에 대한 옵션 "). server.*
네임 스페이스는 여기에 매우 유용하며,이 같은 네임 스페이스를 포함 server.tomcat.*
, server.jetty.*
서버 별 기능 및 다른 사람을. 공통 응용 프로그램 속성 목록을 참조하십시오 .
이전 섹션에서는 압축, SSL 또는 HTTP / 2와 같은 많은 일반적인 사용 사례를 이미 다루었습니다. 그러나 사용 사례에 대한 구성 키가 없으면를 참조하십시오 WebServerFactoryCustomizer
. 이러한 구성 요소를 선언하고 선택한 서버 팩토리에 액세스 할 수 있습니다. 선택한 서버 (Tomcat, Jetty, Reactor Netty, Undertow) 및 선택한 웹 스택 (서블릿 또는 리 액티브)에 대한 변형을 선택해야합니다.
아래 예는 spring-boot-starter-web
(서블릿 스택) 이있는 Tomcat에 대한 것입니다 .
@Component
public class MyTomcatWebServerCustomizer
implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// customize the factory here
}
}
또한 Spring Boot는 다음을 제공합니다.
섬기는 사람 | 서블릿 스택 | 반응성 스택 |
---|---|---|
수코양이 |
|
|
둑 |
|
|
언더 토우 |
|
|
원자로 |
해당 없음 |
|
에 액세스 WebServerFactory
하면 서버 별 API를 사용하여 커넥터, 서버 리소스 또는 서버 자체와 같은 특정 부분을 구성하기 위해 맞춤 설정 도구를 추가 할 수 있습니다.
최후의 수단으로, 당신은 또한 자신의 WebServerFactory
컴포넌트를 선언 할 수 있으며 , 이것은 스프링 부트가 제공하는 컴포넌트를 무시합니다. 이 경우 server
더 이상 네임 스페이스의 구성 속성에 의존 할 수 없습니다 .
9.3.10. 애플리케이션에 서블릿, 필터 또는 리스너 추가
와 즉, 서블릿 스택 응용 프로그램에서 spring-boot-starter-web
, 두 개의 추가 할 수있는 방법이 있습니다 Servlet
, Filter
, ServletContextListener
, 및 응용 프로그램에 서블릿 API가 지원하는 다른 청취자는 :
스프링 빈을 사용하여 서블릿, 필터 또는 리스너 추가
를 추가하려면 Servlet
, Filter
또는 서블릿 *Listener
Spring 빈을 사용하여, 당신은 제공해야 @Bean
그것에 대한 정의를. 구성이나 종속성을 주입 할 때 매우 유용합니다. 그러나 응용 프로그램 라이프 사이클 초기에 컨테이너에 너무 많은 다른 Bean을 설치해야하므로 너무 많은 다른 Bean을 초기화하지 않도록주의해야합니다. 예를 들어, 사용자 DataSource
또는 JPA 구성 에 종속되도록하는 것은 좋지 않습니다 . 초기화 대신에 처음 사용할 때 Bean을 느리게 초기화하여 이러한 제한 사항을 해결할 수 있습니다.
의 경우 Filters
와 Servlets
, 당신은 또한 추가로 매핑 및 초기화 매개 변수를 추가 할 수 있습니다 FilterRegistrationBean
또는을 ServletRegistrationBean
의 또는 기본 구성 요소에 추가하여 대신.
|
다른 스프링 빈과 마찬가지로 서블릿 필터 빈의 순서를 정의 할 수 있습니다. “ 서블릿, 필터 및 리스너를 스프링 빈으로 등록 ”섹션을 확인하십시오.
서블릿 또는 필터 등록 비활성화
으로 앞에서 설명한 모든 Servlet
또는 Filter
콩이 자동으로 서블릿 컨테이너에 등록됩니다. 특정 Filter
또는 Servlet
Bean의 등록을 사용 불가능하게하려면 다음 예제와 같이 등록 Bean을 작성하여 사용 불가능으로 표시하십시오.
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
클래스 경로 스캔을 사용하여 서블릿, 필터 및 리스너 추가
@WebServlet
, @WebFilter
및 @WebListener
주석 클래스는 자동으로 주석에 의해 임베디드 서블릿 컨테이너로 등록 할 수 있습니다 @Configuration
로 수업을 @ServletComponentScan
하고 등록하려는 구성 요소를 포함하는 패키지 (들)을 지정. 기본적으로 @ServletComponentScan
주석이 달린 클래스의 패키지에서 스캔합니다.
9.3.11. 액세스 로깅 구성
각각의 네임 스페이스를 통해 Tomcat, Undertow 및 Jetty에 대한 액세스 로그를 구성 할 수 있습니다.
예를 들어 다음 설정은 사용자 정의 패턴 으로 Tomcat에 대한 액세스를 기록합니다 .
server.tomcat.basedir=my-tomcat
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
로그의 기본 위치 logs 는 Tomcat 기본 디렉토리와 관련된 디렉토리입니다. 기본적으로 logs 디렉토리는 임시 디렉토리이므로 Tomcat의 기본 디렉토리를 수정하거나 로그의 절대 경로를 사용할 수 있습니다. 이전 예에서 로그는 my-tomcat/logs 응용 프로그램의 작업 디렉토리와 관련하여 사용 가능합니다. |
Undertow에 대한 액세스 로깅은 다음 예제와 같이 유사한 방식으로 구성 할 수 있습니다.
server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)
로그는 logs
응용 프로그램의 작업 디렉토리와 관련된 디렉토리에 저장됩니다 . server.undertow.accesslog.dir
속성 을 설정하여이 위치를 사용자 지정할 수 있습니다 .
마지막으로 Jetty에 대한 액세스 로깅을 다음과 같이 구성 할 수도 있습니다.
server.jetty.accesslog.enabled=true
server.jetty.accesslog.filename=/var/log/jetty-access.log
기본적으로 로그는로 리디렉션됩니다 System.err
. 자세한 내용 은 Jetty 설명서를 참조하십시오 .
9.3.12. 프런트 엔드 프록시 서버 뒤에서 실행
애플리케이션이 프록시,로드 밸런서 또는 클라우드에서 실행중인 경우 요청 정보 (호스트, 포트, 구성표 등)가 변경 될 수 있습니다. 응용 프로그램이 실행 중일 수 10.10.10.10:8080
있지만 HTTP 클라이언트는에만 표시 example.org
됩니다.
RFC7239 "전달 헤더" 는 Forwarded
HTTP 헤더를 정의합니다 . 프록시는이 헤더를 사용하여 원래 요청에 대한 정보를 제공 할 수 있습니다. HTTP 302 응답, JSON 문서 또는 HTML 페이지에서 링크를 작성하고 클라이언트로 전송할 때 해당 헤더를 읽고 해당 정보를 자동으로 사용하도록 애플리케이션을 구성 할 수 있습니다. 비표준 헤더, 같은도있다 X-Forwarded-Host
, X-Forwarded-Port
, X-Forwarded-Proto
, X-Forwarded-Ssl
, 그리고 X-Forwarded-Prefix
.
프록시가 일반적으로 사용되는 추가하는 경우 X-Forwarded-For
와 X-Forwarded-Proto
설정, 헤더 server.forward-headers-strategy
에 NATIVE
사람들을 지원하기에 충분하다. 이 옵션을 사용하면 웹 서버 자체가 기본적으로이 기능을 지원합니다. 특정 동작에 대해 알아 보려면 해당 설명서를 확인할 수 있습니다.
이것으로 충분하지 않으면 Spring Framework는 ForwardedHeaderFilter를 제공합니다 . 설정하여 응용 프로그램에서 서블릿 필터는 다음과 같이 당신은 그것을 등록 할 수 있습니다 server.forward-headers-strategy
로 설정됩니다 FRAMEWORK
.
애플리케이션이 Cloud Foundry 또는 Heroku에서 실행되는 경우 server.forward-headers-strategy 속성의 기본값은 NATIVE 입니다. 다른 모든 경우에는 기본값이 NONE 입니다. |
Tomcat의 프록시 구성 사용자 정의
Tomcat을 사용하는 경우 다음 예와 같이 "전달 된"정보를 전달하는 데 사용되는 헤더 이름을 추가로 구성 할 수 있습니다.
server.tomcat.remoteip.remote-ip-header = x-your-remote-ip-header
server.tomcat.remoteip.protocol-header = x-your-protocol-header
Tomcat은 신뢰할 수있는 내부 프록시와 일치하는 기본 정규식으로 구성됩니다. 기본적으로 IP 주소는 10/8
, 192.168/16
, 169.254/16
그리고 127/8
신뢰할 수있는. application.properties
다음 예제와 같이에 항목을 추가하여 밸브 구성을 사용자 정의 할 수 있습니다 .
server.tomcat.remoteip.internal-proxies = 192 \\. 168 \\. \\ d {1,3} \\. \\ d {1,3}
이중 백 슬래시는 구성에 특성 파일을 사용하는 경우에만 필요합니다. YAML을 사용하는 경우 단일 백 슬래시이면 충분하며 앞의 예제에 표시된 값과 같습니다 192\.168\.\d{1,3}\.\d{1,3} . |
internal-proxies 를 빈 으로 설정하여 모든 프록시를 신뢰할 수 있지만 프로덕션에서는 그렇게하지 마십시오. |
RemoteIpValve
자동 설정을 끄고 (설정하려면 server.forward-headers-strategy=NONE
) TomcatServletWebServerFactory
Bean 에 새 밸브 인스턴스를 추가하여 Tomcat의 구성을 완전히 제어 할 수 있습니다 .
9.3.13. Tomcat으로 여러 커넥터 활성화
당신은 추가 할 수 있습니다 org.apache.catalina.connector.Connector
받는 TomcatServletWebServerFactory
다음 예에서와 같이, HTTP 및 HTTPS 커넥터 등 다양한 커넥터를 허용 할 수있는 :
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource("keystore").getFile();
File truststore = new ClassPathResource("keystore").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("changeit");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("changeit");
protocol.setKeyAlias("apitester");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + keystore
+ "] or truststore: [" + truststore + "]", ex);
}
}
9.3.14. Tomcat의 LegacyCookieProcessor 사용
기본적으로 Spring Boot에서 사용하는 내장 Tomcat은 쿠키 형식의 "버전 0"을 지원하지 않으므로 다음 오류가 표시 될 수 있습니다.
java.lang.IllegalArgumentException : 쿠키 값에 유효하지 않은 문자 [32]가 있습니다.
가능하면 나중에 쿠키 사양을 준수하는 값만 저장하도록 코드를 업데이트하는 것이 좋습니다. 그러나 쿠키 작성 방식을 변경할 수없는 경우 대신을 사용하도록 Tomcat을 구성 할 수 있습니다 LegacyCookieProcessor
. 로 전환하려면 다음 예제와 같이을 추가 LegacyCookieProcessor
하는 WebServerFactoryCustomizer
Bean을 사용하십시오 TomcatContextCustomizer
.
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
return (factory) -> factory
.addContextCustomizers((context) -> context.setCookieProcessor(new LegacyCookieProcessor()));
}
9.3.15. Tomcat의 MBean 레지스트리 사용
내장 Tomcat의 MBean 레지스트리는 기본적으로 비활성화되어 있습니다. 이는 Tomcat의 메모리 공간을 최소화합니다. 예를 들어 Tomcat의 MBean을 사용하여 Micrometer를 통해 메트릭을 노출하는 데 사용할 수 있으 server.tomcat.mbeanregistry.enabled
려면 다음 예제와 같이 특성을 사용하여 이를 수행 해야합니다 .
server.tomcat.mbeanregistry.enabled=true
9.3.16. Undertow로 여러 리스너 사용
추가 UndertowBuilderCustomizer
받는 사람 UndertowServletWebServerFactory
과에 리스너를 추가 Builder
다음 예제와 같이 :
@Bean
public UndertowServletWebServerFactory servletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {
@Override
public void customize(Builder builder) {
builder.addHttpListener(8080, "0.0.0.0");
}
});
return factory;
}
9.3.17. @ServerEndpoint를 사용하여 WebSocket 엔드 포인트 생성
사용할 경우 @ServerEndpoint
내장 용기를 사용하는 스프링 부팅 응용 프로그램에서, 당신은 하나의 선언해야 ServerEndpointExporter
@Bean
다음 예제와 같이 :
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
앞의 예제에 표시된 Bean은 @ServerEndpoint
주석이 달린 Bean을 기본 WebSocket 컨테이너에 등록합니다 . 독립형 서블릿 컨테이너에 배치 될 때이 역할은 서블릿 컨테이너 초기화 프로그램에 의해 수행되며 ServerEndpointExporter
Bean은 필요하지 않습니다.
9.4. 스프링 MVC
Spring Boot에는 Spring MVC를 포함하는 여러 스타터가 있습니다. 일부 스타터는 스프링 MVC에 직접 의존하지 않고 의존성을 포함합니다. 이 섹션에서는 Spring MVC 및 Spring Boot에 대한 일반적인 질문에 답변합니다.
9.4.1. JSON REST 서비스 작성
@RestController
다음 예제와 같이 Jackson Boot가 클래스 경로에있는 한 Spring Boot 애플리케이션의 모든 Spring 은 기본적으로 JSON 응답을 렌더링해야합니다.
@RestController
public class MyController {
@RequestMapping("/thing")
public MyThing thing() {
return new MyThing();
}
}
길이만큼 MyThing
(정상 또는 POJO 그루비 객체 TRUE) Jackson2 직렬화 할 수 있고, 다음 localhost:8080/thing
기본적으로 JSON의 표현을 제공. 브라우저에서는 XML을 선호하는 수락 헤더를 보내는 경향이 있기 때문에 브라우저에서 때때로 XML 응답이 표시 될 수 있습니다.
9.4.2. XML REST 서비스 작성
jackson-dataformat-xml
클래스 경로에 Jackson XML 확장 ( )이있는 경우이를 사용하여 XML 응답을 렌더링 할 수 있습니다. JSON에 사용한 이전 예제가 작동합니다. Jackson XML 렌더러를 사용하려면 프로젝트에 다음 종속성을 추가하십시오.
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
Jackson의 XML 확장을 사용할 수없고 JAXB를 사용할 수있는 경우 다음 예와 같이 XML로 MyThing
주석을 추가해야하는 추가 요구 사항으로 XML을 렌더링 할 수 있습니다 @XmlRootElement
.
@XmlRootElement
public class MyThing {
private String name;
// .. getters and setters
}
JAXB는 Java 8과 함께 즉시 사용할 수 있습니다. 최신 Java 생성을 사용중인 경우 프로젝트에 다음 종속성을 추가하십시오.
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
서버가 JSON 대신 XML을 렌더링하도록하려면 Accept: text/xml 헤더 를 보내 거나 브라우저를 사용해야합니다. |
9.4.3. Jackson ObjectMapper 사용자 정의
Spring MVC (클라이언트 및 서버 측)는 HttpMessageConverters
HTTP 교환에서 컨텐츠 변환을 협상하는 데 사용 합니다. Jackson이 클래스 경로에 있으면 이미 제공 한 기본 변환기가 제공되며 Jackson2ObjectMapperBuilder
인스턴스는 자동으로 구성됩니다.
는 ObjectMapper
(또는 XmlMapper
예 (기본적으로 생성) 잭슨 XML을 변환) 다음과 같은 사용자 정의 속성이 있습니다 :
MapperFeature.DEFAULT_VIEW_INCLUSION
비활성화DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
비활성화SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
비활성화
Spring Boot에는이 동작을보다 쉽게 사용자 정의 할 수있는 몇 가지 기능이 있습니다.
환경을 사용하여 ObjectMapper
및 XmlMapper
인스턴스를 구성 할 수 있습니다 . Jackson은 처리의 다양한 측면을 구성하는 데 사용할 수있는 광범위한 간단한 온 / 오프 기능을 제공합니다. 이러한 기능은 환경의 속성에 매핑되는 6 개의 열거 형 (Jackson)에 설명되어 있습니다.
열거 형 | 특성 | 가치 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
예를 들어, 예쁜 인쇄를 활성화하려면을 설정하십시오 spring.jackson.serialization.indent_output=true
. 의 사용 덕분에 그 참고 바인딩 완화를 ,의 경우 indent_output
입니다 해당 열거 형 정수의 경우 일치 할 필요가 없습니다 INDENT_OUTPUT
.
이 환경 기반 구성은 자동 구성 Jackson2ObjectMapperBuilder
Bean에 적용되며 자동 구성 ObjectMapper
Bean을 포함하여 빌더를 사용하여 작성된 모든 맵퍼에 적용됩니다 .
컨텍스트 Jackson2ObjectMapperBuilder
는 하나 이상의 Jackson2ObjectMapperBuilderCustomizer
Bean 으로 사용자 정의 할 수 있습니다 . 이러한 사용자 정의 프로그램 Bean은 주문할 수 있으며 (부트 자체 사용자 정의 프로그램의 순서는 0 임), 부트 사용자 정의 전후에 추가 사용자 정의를 적용 할 수 있습니다.
모든 유형의 Bean com.fasterxml.jackson.databind.Module
은 자동 구성에 자동으로 등록되어 작성 Jackson2ObjectMapperBuilder
하는 모든 ObjectMapper
인스턴스에 적용됩니다 . 이는 애플리케이션에 새 기능을 추가 할 때 사용자 정의 모듈을 제공하기위한 글로벌 메커니즘을 제공합니다.
기본값을 ObjectMapper
완전히 바꾸려면 @Bean
해당 유형을 정의하고 이를 표시 @Primary
하거나 빌더 기반 접근 방식을 선호하는 경우을 정의하십시오 Jackson2ObjectMapperBuilder
@Bean
. 두 경우 모두에 대한 모든 자동 구성이 비활성화됩니다 ObjectMapper
.
@Beans
유형 을 제공 MappingJackson2HttpMessageConverter
하면 MVC 구성의 기본값이 대체됩니다. 또한 편리한 유형의 Bean HttpMessageConverters
이 제공되며 기본 MVC 구성을 사용하는 경우 항상 사용 가능합니다. 기본 및 사용자 향상 메시지 변환기에 액세스하는 유용한 방법이 있습니다.
자세한 내용은“ @ResponseBody 렌더링 사용자 정의 ”섹션 및 WebMvcAutoConfiguration
소스 코드를 참조하십시오.
9.4.4. @ResponseBody 렌더링 사용자 정의
Spring은 HttpMessageConverters
렌더링 @ResponseBody
(또는의 응답 @RestController
)을 사용합니다. Spring Boot 컨텍스트에서 적절한 유형의 Bean을 추가하여 추가 변환기를 제공 할 수 있습니다. 추가 한 Bean이 기본적으로 MappingJackson2HttpMessageConverter
JSON 변환 과 같이 기본적으로 포함 된 유형 인 경우 기본값을 대체합니다. 편리한 Bean 유형 HttpMessageConverters
이 제공되며 기본 MVC 구성을 사용하는 경우 항상 사용 가능합니다. 기본 및 사용자 향상 메시지 변환기에 액세스하는 데 유용한 방법이 있습니다 (예를 들어, custom에 수동으로 삽입하려는 경우 유용 할 수 있음 RestTemplate
).
일반적인 MVC 사용에서와 같이 WebMvcConfigurer
제공하는 모든 Bean은 configureMessageConverters
메소드 를 대체하여 변환기를 제공 할 수도 있습니다 . 그러나 일반 MVC와 달리 필요한 추가 변환기 만 제공 할 수 있습니다 (Spring Boot는 동일한 메커니즘을 사용하여 기본값을 제공하기 때문에). 마지막으로, 자체 @EnableWebMvc
구성 을 제공하여 Spring Boot 기본 MVC 구성을 선택 해제 하면 getMessageConverters
에서 를 사용하여 완전히 제어하고 모든 것을 수동으로 수행 할 수 있습니다 WebMvcConfigurationSupport
.
자세한 내용은 WebMvcAutoConfiguration
소스 코드를 참조하십시오.
9.4.5. 멀티 파트 파일 업로드 처리
Spring Boot는 Servlet 3 javax.servlet.http.Part
API를 채택하여 파일 업로드를 지원합니다. 기본적으로 Spring Boot는 단일 요청에서 파일 당 최대 1MB의 파일 크기와 최대 10MB의 파일 데이터로 Spring MVC를 구성합니다. 이 값, 중간 데이터가 저장된 위치 (예 : /tmp
디렉토리) 및 MultipartProperties
클래스에 노출 된 속성을 사용하여 데이터가 디스크로 플러시되는 임계 값을 무시할 수 있습니다 . 예를 들어 파일을 무제한으로 지정하려면 spring.servlet.multipart.max-file-size
속성을로 설정하십시오 -1
.
멀티 파트 지원은 스프링 MVC 컨트롤러 핸들러 메소드에서 멀티 파트 인코딩 된 파일 데이터를- @RequestParam
주석이 붙은 유형의 매개 변수 로 수신하려는 경우에 유용 MultipartFile
합니다.
자세한 내용은 MultipartAutoConfiguration
소스를 참조하십시오.
Apache Commons File Upload와 같은 추가 종속성을 도입하는 대신 컨테이너의 내장 된 멀티 파트 업로드 지원을 사용하는 것이 좋습니다. |
9.4.6. 스프링 MVC 디스패처 서블릿 끄기
기본적으로 모든 컨텐츠는 애플리케이션의 루트 ( /
)에서 제공됩니다. 다른 경로에 매핑하려는 경우 다음과 같이 경로를 구성 할 수 있습니다.
spring.mvc.servlet.path=/acme
추가 서블릿이있는 경우 @Bean
유형을 선언 Servlet
하거나 ServletRegistrationBean
각각에 대해 스프링 부트가 컨테이너에 투명하게 등록합니다. 서블릿은 이러한 방식으로 등록되므로 DispatcherServlet
이를 호출하지 않고 서브 컨텍스트에 맵핑 할 수 있습니다 .
DispatcherServlet
자신을 구성하는 것은 드문 일이지만 실제로 수행 해야하는 경우 사용자 정의 경로를 제공하기 위해 @Bean
유형 DispatcherServletPath
을 제공해야합니다 DispatcherServlet
.
9.4.7. 기본 MVC 구성 끄기
MVC 구성을 완벽하게 제어하는 가장 쉬운 방법 @Configuration
은 @EnableWebMvc
주석 을 제공하는 것 입니다. 그렇게하면 모든 MVC 구성이 그대로 유지됩니다.
9.4.8. ViewResolvers 사용자 정의
A ViewResolver
는 스프링 MVC의 핵심 컴포넌트로 뷰 이름 @Controller
을 실제 View
구현으로 변환합니다 . 참고 ViewResolvers
주로 (A가 아니라 REST 스타일의 서비스에 비해 UI 애플리케이션에 사용되는 View
을 렌더링하는 데 사용되지 않습니다 @ResponseBody
). ViewResolver
선택할 수 있는 많은 구현이 있으며 Spring 자체는 어떤 것을 사용 해야하는지에 대해서는 의견이 없습니다. 반면 Spring Boot는 클래스 경로와 응용 프로그램 컨텍스트에서 찾은 내용에 따라 하나 또는 두 개를 설치합니다. DispatcherServlet
사용하는 모든 리졸버 그것은 결과를 얻을 때까지 차례로 각 하나를 시도하는 응용 프로그램 컨텍스트에서 찾습니다. 자신을 추가하는 경우 리졸버가 추가 된 순서와 위치를 알고 있어야합니다.
WebMvcAutoConfiguration
ViewResolvers
컨텍스트에 다음 을 추가합니다 .
InternalResourceViewResolver
라는 이름의 'defaultViewResolver'.DefaultServlet
정적 자원 및 JSP 페이지 (사용하는 경우)를 사용 하여 렌더링 할 수있는 실제 자원을 찾습니다 . 그것은 (기본값이 모두 비어 있지만 통해 외부 구성에 액세스 할 수있는 서블릿 컨텍스트에서 해당 경로와 물리적 자원을 찾습니다 다음 접두사와 뷰 이름에 접미사를 적용spring.mvc.view.prefix
하고spring.mvc.view.suffix
). 동일한 유형의 Bean을 제공하여이를 대체 할 수 있습니다.BeanNameViewResolver
이름 '하는 BeanNameViewResolver'. 이것은 뷰 리졸버 체인의 유용한 멤버이며View
해결중인 이름과 동일한 이름의 Bean을 선택합니다 . 재정의하거나 교체 할 필요는 없습니다.ContentNegotiatingViewResolver
이름 '의 viewResolver는'이있는 경우에만 추가되고 있는 유형의 콩 실제로View
존재하는. 이것은 다른 마스터에게 위임하고 클라이언트가 보낸 'Accept'HTTP 헤더와 일치하는 것을 찾으려고하는 '마스터'해결 자입니다. 더 배우기 위해 공부하고 싶을만한 유용한 블로그ContentNegotiatingViewResolver
가 있으며 , 자세한 내용은 소스 코드를 볼 수도 있습니다.ContentNegotiatingViewResolver
'viewResolver'라는 Bean을 정의 하여 자동 구성 을 끌 수 있습니다 .- Thymeleaf를 사용하는 경우
ThymeleafViewResolver
이름이 'thymeleafViewResolver'입니다. 뷰 이름을 접두사와 접미사로 묶어 리소스를 찾습니다. 접두사는spring.thymeleaf.prefix
이고 접미사는spring.thymeleaf.suffix
입니다. 접두사 및 접미사의 값은 각각 'classpath : / templates /'및 '.html'입니다.ThymeleafViewResolver
동일한 이름의 Bean을 제공하여 대체 할 수 있습니다 . - FreeMarker를 사용하는 경우
FreeMarkerViewResolver
이름이 'freeMarkerViewResolver'입니다.spring.freemarker.templateLoaderPath
뷰 이름을 접두사와 접미어 로 묶어 로더 경로 (외부화되고 기본값은 'classpath : / templates /'인 자원)를 찾습니다 . 접두사는로 외부화되고spring.freemarker.prefix
접미 부는로 외부화됩니다spring.freemarker.suffix
. 접두사와 접미사의 기본값은 각각 비어 있고 '.ftlh'입니다.FreeMarkerViewResolver
동일한 이름의 Bean을 제공하여 대체 할 수 있습니다 . - Groovy 템플릿을 사용하는 경우 (실제로
groovy-templates
클래스 경로에있는 경우)GroovyMarkupViewResolver
이름이 'groovyMarkupViewResolver'입니다. 뷰 이름을 접두사와 접미사로 묶어 로더 경로에서 리소스를 찾습니다 (spring.groovy.template.prefix
및로 외부화 됨spring.groovy.template.suffix
). 접두사와 접미어의 기본값은 각각 'classpath : / templates /'및 '.tpl'입니다.GroovyMarkupViewResolver
동일한 이름의 Bean을 제공하여 대체 할 수 있습니다 . - Mustache를 사용하는 경우
MustacheViewResolver
이름이 'mustacheViewResolver' 이기도 합니다. 뷰 이름을 접두사와 접미사로 묶어 리소스를 찾습니다. 접두사는spring.mustache.prefix
이고 접미사는spring.mustache.suffix
입니다. 접두사 및 접미사의 값은 각각 'classpath : / templates /'및 '.mustache'입니다.MustacheViewResolver
동일한 이름의 Bean을 제공하여 대체 할 수 있습니다 .
자세한 내용은 다음 섹션을 참조하십시오.
9.5. 스프링 보안 테스트
Spring Security는 특정 사용자로서 테스트를 실행하는 것을 지원합니다. 예를 들어 아래 스 니펫의 테스트는 ADMIN
역할 이있는 인증 된 사용자로 실행됩니다 .
@Test
@WithMockUser(roles="ADMIN")
public void requestProtectedUrlWithUser() throws Exception {
mvc
.perform(get("/"))
...
}
Spring Security는 Spring MVC Test와의 포괄적 인 통합을 제공하며 @WebMvcTest
슬라이스 및를 사용하여 컨트롤러를 테스트 할 때도 사용할 수 있습니다 MockMvc
.
Spring Security의 테스트 지원에 대한 추가 세부 사항은 Spring Security의 참조 문서를 참조 하십시오 .
9.6. 저지
9.6.1. Spring Security를 통한 Secure Jersey 엔드 포인트
Spring Security는 Spring MVC 기반 웹 응용 프로그램을 보호하는 데 사용할 수있는 것과 거의 동일한 방식으로 Jersey 기반 웹 응용 프로그램을 보호하는 데 사용할 수 있습니다. 그러나 Jersey에서 Spring Security의 메소드 레벨 보안을 사용하려면 setStatus(int)
오히려 를 사용하도록 Jersey를 구성해야합니다 sendError(int)
. 이는 Spring Security가 클라이언트에 인증 또는 권한 부여 실패를보고 할 기회를 갖기 전에 Jersey가 응답을 커밋하지 못하게합니다.
jersey.config.server.response.setStatusOverSendError
속성으로 설정해야합니다 true
응용 프로그램에 ResourceConfig
다음 예와 같이, 콩 :
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
setProperties(Collections.singletonMap("jersey.config.server.response.setStatusOverSendError", true));
}
}
9.6.2. 다른 웹 프레임 워크와 함께 Jersey 사용
Spring MVC와 같은 다른 웹 프레임 워크와 함께 Jersey를 사용하려면 다른 프레임 워크가 처리 할 수없는 요청을 처리 할 수 있도록 구성해야합니다. 먼저, spring.jersey.type
애플리케이션 특성 값을 구성하여 서블릿이 아닌 필터를 사용하도록 Jersey를 구성하십시오 filter
. 둘째, ResourceConfig
다음 예와 같이 404가 된 요청을 전달 하도록 구성하십시오 .
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
property(ServletProperties.FILTER_FORWARD_ON_404, true);
}
}
9.7. HTTP 클라이언트
Spring Boot는 HTTP 클라이언트와 함께 작동하는 많은 스타터를 제공합니다. 이 섹션에서는 사용과 관련된 질문에 답변합니다.
9.7.1. 프록시를 사용하도록 RestTemplate 구성
에서 설명한 바와 같이 RestTemplate 사용자 정의 , 당신은을 사용 RestTemplateCustomizer
하여 RestTemplateBuilder
사용자 정의 구축 RestTemplate
. RestTemplate
프록시를 사용하도록 구성된 구성을 만드는 데 권장되는 방법입니다 .
프록시 구성의 정확한 세부 사항은 사용중인 기본 클라이언트 요청 팩토리에 따라 다릅니다. 다음 예제는 다음을 제외한 모든 호스트에 프록시를 사용하는 구성 HttpComponentsClientRequestFactory
으로 구성 됩니다 .HttpClient
192.168.0.5
static class ProxyCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
HttpHost proxy = new HttpHost("proxy.example.com");
HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
@Override
public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)
throws HttpException {
if (target.getHostName().equals("192.168.0.5")) {
return null;
}
return super.determineProxy(target, request, context);
}
}).build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}
9.7.2. Reactor Netty 기반 WebClient에서 사용하는 TcpClient 구성
Reactor Netty가 클래스 경로에 있으면 Reactor Netty 기반 WebClient
이 자동 구성됩니다. 클라이언트의 네트워크 연결 처리를 사용자 정의하려면 ClientHttpConnector
Bean을 제공하십시오 . 다음 예제는 60 초의 연결 시간 초과를 구성하고 다음을 추가합니다 ReadTimeoutHandler
.
@Bean
ClientHttpConnector clientHttpConnector(ReactorResourceFactory resourceFactory) {
TcpClient tcpClient = TcpClient.create(resourceFactory.getConnectionProvider())
.runOn(resourceFactory.getLoopResources()).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60000)
.doOnConnected((connection) -> connection.addHandlerLast(new ReadTimeoutHandler(60)));
return new ReactorClientHttpConnector(HttpClient.from(tcpClient));
}
ReactorResourceFactory 연결 제공자 및 이벤트 루프 자원 의 사용에 유의하십시오 . 이를 통해 서버는 요청을 받고 클라이언트가 요청을하기 위해 리소스를 효율적으로 공유 할 수 있습니다. |
Spring Boot Reference DocumentationPhillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott FrederickLegal2.3.1.RELEASE Copyright © 2012-2020 Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. |