본문 바로가기

IT/SpringBoot

스프링 부트 #4.7 웹 애플리케이션 개발

반응형

 

4.7. 웹 애플리케이션 개발

스프링 부트은 웹 응용 프로그램 개발에 적합합니다. 임베디드 톰캣, 부두, 언더토우 또는 네티를 사용하여 독립적인 HTTP 서버를 만들 수 있습니다. 대부분의 웹 응용 프로그램은 모듈을 사용하여 빠르게 가동및 실행됩니다. 모듈을 사용하여 반응형 웹 응용 프로그램을 빌드하도록 선택할 수도 있습니다.spring-boot-starter-webspring-boot-starter-webflux

아직 스프링 부트 웹 응용 프로그램을 개발하지 않은 경우 시작 섹션에서 "Hello World!" 예제를 따를 수 있습니다.

4.7.1. "스프링 웹 MVC 프레임워크"

스프링 웹 MVC 프레임워크(종종 단순히 "스프링 MVC"라고도 함)는 풍부한 "모델 뷰 컨트롤러" 웹 프레임워크입니다. Spring MVC를 사용하면 들어오는 HTTP 요청을 처리하기 위해 특수 또는 콩을 만들 수 있습니다. 컨트롤러의 메서드는 주석을 사용하여 HTTP에 매핑됩니다.@Controller@RestController@RequestMapping

다음 코드에는 JSON 데이터를 제공하는 일반적인 코드가 표시됩니다.@RestController

@RestController
@RequestMapping(value="/users")
public class MyRestController {

    @RequestMapping(value="/{user}", method=RequestMethod.GET)
    public User getUser(@PathVariable Long user) {
        // ...
    }

    @RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
    List<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
    }

    @RequestMapping(value="/{user}", method=RequestMethod.DELETE)
    public User deleteUser(@PathVariable Long user) {
        // ...
    }

}

Spring MVC는 핵심 스프링 프레임워크의 일부이며 자세한 정보는 참조 문서에서사용할 수 있습니다. spring.io/guides스프링 MVC를 다루는 몇 가지 가이드도 있습니다.

스프링 MVC 자동 구성

스프링 부트은 대부분의 응용 프로그램과 잘 작동하는 스프링 MVC에 대한 자동 구성을 제공합니다.

자동 구성은 Spring의 기본 값 위에 다음과 같은 기능을 추가합니다.

이러한 Spring Boot MVC 사용자 지정을 유지하고 더 많은 MVC 사용자 지정(인터셉터, 주문, 뷰 컨트롤러 및 기타 기능)을 만들려면 고유한 유형 클래스를 추가할 수 있습니다.@ConfigurationWebMvcConfigurer@EnableWebMvc

사용자 지정 인스턴스를 제공하거나 스프링 부트 MVC 사용자 지정 을 유지하려는 경우 형식의 빈을 선언하고 해당 구성 요소의 사용자 지정 인스턴스를 제공하는 데 사용할 수 있습니다.RequestMappingHandlerMappingRequestMappingHandlerAdapterExceptionHandlerExceptionResolverWebMvcRegistrations

스프링 MVC를 완벽하게 제어하려면 자체 에 추가하거나 Javadoc에 설명된 대로 자체 -notated를 추가할 수 있습니다.@Configuration@EnableWebMvc@ConfigurationDelegatingWebMvcConfiguration@EnableWebMvc

httpMessage 변환기

Spring MVC는 인터페이스를 사용하여 HTTP 요청 및 응답을 변환합니다. 현명한 기본값은 상자 밖으로 포함됩니다. 예를 들어 객체를 자동으로 JSON(Jackson 라이브러리 사용) 또는 XML(잭슨 XML 확장 사용, 사용 가능한 경우 또는 Jackson XML 확장을 사용할 수 없는 경우 JAXB를 사용하여)으로 자동으로 변환할 수 있습니다. 기본적으로 문자열은 에서 인코딩됩니다.HttpMessageConverterUTF-8

변환기를 추가하거나 사용자 지정해야 하는 경우 다음 목록에서 와 같이 스프링 부트클래스를 사용할 수 있습니다.HttpMessageConverters

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}

컨텍스트에 있는 모든 콩이 변환기 목록에 추가됩니다. 또한 동일한 방식으로 기본 변환기를 재정의할 수도 있습니다.HttpMessageConverter

사용자 정의 JSON 직렬화 및 직렬화

Jackson을 사용하여 JSON 데이터를 직렬화하고 분류하는 경우 자신의 클래스와 클래스를 작성할 수 있습니다. 사용자 지정 직렬화는 일반적으로 모듈을 통해 Jackson에 등록되지만스프링 부트은 스프링 콩을 직접 등록할 수 있는 대체 어노피를 제공합니다.JsonSerializerJsonDeserializer@JsonComponent

에 직접 기고 또는 구현을 사용할 수 있습니다. 다음 예제와 같이 직렬라이저/디직재를 내부 클래스로 포함하는 클래스에서도 사용할 수 있습니다.@JsonComponentJsonSerializerJsonDeserializerKeyDeserializer

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;

@JsonComponent
public class Example {

    public static class Serializer extends JsonSerializer<SomeObject> {
        // ...
    }

    public static class Deserializer extends JsonDeserializer<SomeObject> {
        // ...
    }

}

모든 콩은 잭슨에 자동으로 등록됩니다. 메타에 의해 인가되어 있기 때문에 일반적인 구성 요소 스캔 규칙이 적용됩니다.@JsonComponentApplicationContext@JsonComponent@Component

스프링 부트은 또한 JsonObjectSerializer JsonObjectDeserializer 기본 클래스를 제공하며, 이는 객체를 직렬화할 때 표준 Jackson 버전에 유용한 대안을 제공합니다. 자세한 내용은 자바독의 JsonObject Serializer JsonObjectDeserializer를 참조하십시오.

메시지 코드 해결자

Spring MVC에는 바인딩 오류에서 오류 메시지를 렌더링하기 위한 오류 코드를 생성하는 전략이 있습니다. 속성을 설정하거나 스프링 부트이 만들어집니다(기본 메시지코드 Resolver.Format의열거정보 참조).MessageCodesResolverspring.mvc.message-codes-resolver-formatPREFIX_ERROR_CODEPOSTFIX_ERROR_CODE

정적 콘텐츠

기본적으로 Spring Boot는 클래스 경로 또는 클래스 경로의 루트에서 호출되는 디렉토리(또는 또는)의 정적 콘텐츠를 제공합니다. 스프링 MVC에서 사용하므로 고유한 메서드를 추가하고 재정의하여 해당 동작을 수정할 수 있습니다./static/public/resources/META-INF/resourcesServletContextResourceHttpRequestHandlerWebMvcConfigureraddResourceHandlers

독립 실행형 웹 응용 프로그램에서 컨테이너의 기본 서서비스도 활성화되어 있으며 스프링이 처리하지 않기로 결정한 경우 루트의 콘텐츠를 제공하는 대체 역할을 합니다. 스프링은 항상 요청을 통해 요청을 처리할 수 있기 때문에 대부분의 경우 기본 MVC 구성을 수정하지 않으면 발생하지 않습니다.ServletContextDispatcherServlet

기본적으로 리소스는 매핑되지만 속성으로 조정할 수 있습니다. 예를 들어 다음과 같이 수행할 모든 리소스를 재배치할 수 있습니다./**spring.mvc.static-path-pattern/resources/**

spring.mvc.static-path-pattern=/resources/**

속성(기본 값을 디렉터리 위치 목록으로 대체)을 사용하여 정적 리소스 위치를 사용자 지정할 수도 있습니다. 루트 Servlet 컨텍스트 경로는 자동으로 위치로 추가됩니다.spring.resources.static-locations"/"

앞에서 언급한 "표준" 정적 리소스 위치 외에도 Webjars 콘텐츠에대한 특별한 사례가 만들어집니다. 경로가 있는 모든 리소스는 Webjars 형식으로 패키지된 경우 jar 파일에서 제공됩니다./webjars/**

  응용 프로그램이 jar로 포장된 경우 디렉터리를 사용하지 마십시오. 이 디렉토리는 일반적인 표준이지만 전쟁 포장에서만 작동하며 항아리를 생성하는 경우 대부분의 빌드 도구에서 자동으로 무시됩니다. src/main/webapp

스프링 부트은 스프링 MVC에서 제공하는 고급 리소스 처리 기능을 지원하므로 캐시 파열 정적 리소스 또는 웹jar에 대한 버전 불가지론 URL 을 사용하는 것과 같은 사용 사례를 허용합니다.

Webjars에 대 한 버전 불가지론 URL을 사용 하려면 종속성을 추가 합니다. 그런 다음 웹자르를 선언합니다. 예를 들어 jQuery를 사용하여 웹자르 버전이 있는 위치에 결과를 추가합니다.webjars-locator-core"/webjars/jquery/jquery.min.js""/webjars/jquery/x.y.z/jquery.min.js"x.y.z

  JBoss를 사용하는 경우 . 대신 종속성을 선언해야 합니다. 그렇지 않으면 모든 웹자르는 로 확인됩니다. webjars-locator-jboss-vfswebjars-locator-core404

캐시 파열을 사용하려면 다음 구성은 모든 정적 리소스에 대한 캐시 파열 솔루션을 구성하여 URL에 다음과 같은 콘텐츠 해시를 효과적으로 추가합니다.<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>

spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
  리소스에 대한 링크는 타임에 백리메리프 및 FreeMarker에 대해 자동으로 구성된 템플릿으로 다시 작성됩니다. JSP를 사용할 때이 필터를 수동으로 선언해야 합니다. 다른 템플릿 엔진은 현재 자동으로 지원되지 않지만 사용자 지정 템플릿 매크로 / 도우미 및 ResourceUrlProvider를사용할 수 있습니다. ResourceUrlEncodingFilter

예를 들어 JavaScript 모듈 로더를 사용하면 리소스를 동적으로 로드할 때 파일 이름을 바꾸는 것은 옵션이 아닙니다. 그렇기 때문에 다른 전략도 지원되고 결합될 수 있습니다. "고정" 전략은 다음 예제와 같이 파일 이름을 변경하지 않고 URL에 정적 버전 문자열을 추가합니다.

spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12

이 구성을 사용하면 JavaScript 모듈이 고정 버전 화 전략()을 사용하고 다른 리소스는 여전히 콘텐츠 하나를 사용합니다."/js/lib/""/v12/js/lib/mymodule.js"<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>

더 지원되는 옵션은 ResourceProperties를 참조하십시오.

 

이 기능은 전용 블로그 게시물과 스프링 프레임워크의 참조 문서에서철저히 설명되었습니다.

웰컴 페이지

스프링 부트은 정적 및 템플릿 환영 페이지를 모두 지원합니다. 먼저 구성된 정적 콘텐츠 위치에서 파일을 찾습니다. 찾을 수 없는 경우 템플릿을 찾습니다. 둘 중 하나를 발견하면 응용 프로그램의 환영 페이지로 자동으로 사용됩니다.index.htmlindex

커스텀 파비슨

다른 정적 리소스와 마찬가지로 스프링 부트은 구성된 정적 콘텐츠 위치에서 찾습니다. 이러한 파일이 있는 경우 응용 프로그램의 페이슨으로 자동으로 사용됩니다.favicon.ico

경로 일치 및 콘텐츠 협상

Spring MVC는 요청 경로를 보고 응용 프로그램에 정의된 매핑(예: 컨트롤러 메서드의 주석)과 일치하여 처리자에게 들어오는 HTTP 요청을 매핑할 수 있습니다.@GetMapping

Spring Boot는 기본적으로 접미사 패턴 일치를 비활성화하도록 선택하므로 같은 요청이 매핑과 일치하지 않습니다. 이는 Spring MVC 응용 프로그램의 모범 사례로간주됩니다. 이 기능은 적절한 "수락" 요청 헤더를 보내지 않은 HTTP 클라이언트에게 과거에 주로 유용했습니다. 올바른 콘텐츠 유형을 클라이언트로 보내야 했습니다. 요즘 콘텐츠 협상은 훨씬 더 신뢰할 수 있습니다."GET /projects/spring-boot.json"@GetMapping("/projects/spring-boot")

적절한 "수락" 요청 헤더를 일관되게 보내지 않는 HTTP 클라이언트를 처리하는 다른 방법이 있습니다. 접미사 일치를 사용하는 대신 쿼리 매개 변수를 사용하여 다음과 같은 요청이 매핑되도록 할 수 있습니다."GET /projects/spring-boot?format=json"@GetMapping("/projects/spring-boot")

spring.mvc.contentnegotiation.favor-parameter=true

# We can change the parameter name, which is "format" by default:
# spring.mvc.contentnegotiation.parameter-name=myparam

# We can also register additional file extensions/media types with:
spring.mvc.contentnegotiation.media-types.markdown=text/markdown

접미사 패턴 일치는 사용되지 않으며 향후 릴리스에서 제거됩니다. 주의 사항을 이해하고 응용 프로그램에서 접미사 패턴 일치를 사용하려면 다음 구성이 필요합니다.

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true

또는 모든 접미사 패턴을 여는 대신 등록된 접미사 패턴을 지원하는 것이 더 안전합니다.

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-registered-suffix-pattern=true

# You can also register additional file extensions/media types with:
# spring.mvc.contentnegotiation.media-types.adoc=text/asciidoc
구성 가능한 WebBinding 이이리라이저

Spring MVC는 특정 요청에 대해 초기화하기 위해 a를 사용합니다. 직접 만들면 스프링 부트을 사용하도록 스프링 MVC를 자동으로 구성합니다.WebBindingInitializerWebDataBinderConfigurableWebBindingInitializer@Bean

템플릿 엔진

REST 웹 서비스뿐만 아니라 스프링 MVC를 사용하여 동적 HTML 콘텐츠를 제공할 수도 있습니다. Spring MVC는 타임리프, 프리마커 및 JSP를 포함한 다양한 템플릿 기술을 지원합니다. 또한 다른 많은 템플릿 엔진에는 자체 Spring MVC 통합이 포함됩니다.

스프링 부트에는 다음 템플릿 엔진에 대한 자동 구성 지원이 포함됩니다.

  가능하면 JSP를 피해야 합니다. 임베디드 서블릿 컨테이너와 함께 사용할 때 알려진 몇 가지 제한 사항이 있습니다.

기본 구성이 있는 이러한 템플릿 엔진 중 하나를 사용하면 템플릿을 에서 자동으로 선택합니다.src/main/resources/templates

  응용 프로그램을 실행하는 방법에 따라 IntelliJ IDEA는 클래스 경로를 다르게 주문합니다. 기본 방법에서 IDE에서 응용 프로그램을 실행하면 Maven 또는 Gradle 또는 포장 된 항아리에서 응용 프로그램을 실행할 때와 다른 순서가 발생합니다. 이로 인해 스프링 부트이 클래스 경로에서 템플릿을 찾지 못할 수 있습니다. 이 문제가 있는 경우 IDE의 클래스 경로를 다시 정렬하여 모듈의 클래스와 리소스를 먼저 배치할 수 있습니다. 또는 다음과 같이 템플릿 접두사를 구성하여 클래스패스의 모든 디렉터리를 검색할 수 있습니다. templatesclasspath*:/templates/
오류 처리

기본적으로 Spring Boot는 모든 오류를 합리적인 방식으로 처리하는 매핑을 제공하며 서슬릿 컨테이너의 "전역" 오류 페이지로 등록됩니다. 컴퓨터 클라이언트의 경우 오류, HTTP 상태 및 예외 메시지에 대한 세부 정보가 있는 JSON 응답을 생성합니다. 브라우저 클라이언트의 경우 HTML 형식으로 동일한 데이터를 렌더링하는 "화이트 라벨" 오류 보기(사용자 지정, 해결된 데이터를 추가)가 있습니다. 기본 동작을 완전히 대체하려면 해당 형식의 콩 정의를 구현 및 등록하거나 기존 메커니즘을 사용하지만 내용을 대체하기 위해 빈 형식을 추가할 수 있습니다./errorViewerrorErrorControllerErrorAttributes

  이 클래스는 사용자 지정의 기본 클래스로 사용할 수 있습니다. 이 기능은 새 콘텐츠 유형에 대한 처리기를 추가하려는 경우에 특히 유용합니다(기본값은 특별히 처리하고 다른 모든 항목의 대체를 제공하는 것입니다). 이렇게 하려면 특성이 있는 공용 메서드를 확장하고 새 형식의 빈을 만듭니다. BasicErrorControllerErrorControllertext/htmlBasicErrorController@RequestMappingproduces

다음 예제와 같이 JSON 문서를 사용자 지정하여 특정 컨트롤러 및/또는 예외 유형에 대해 반환하도록 지정하는 클래스를 정의할 수도 있습니다.@ControllerAdvice

@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {

    @ExceptionHandler(YourException.class)
    @ResponseBody
    ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
        HttpStatus status = getStatus(request);
        return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }

}

앞의 예에서, 동일한 패키지에 정의된 컨트롤러에 의해 throw되는 경우 POJO의 JSON 표현대신 표현이 사용된다.YourExceptionAcmeControllerCustomErrorTypeErrorAttributes

사용자 지정 오류 페이지

지정된 상태 코드에 대한 사용자 지정 HTML 오류 페이지를 표시하려면 디렉터리에 파일을 추가할 수 있습니다. 오류 페이지는 정적 HTML(즉, 정적 리소스 디렉터리 아래에 추가)이거나 템플릿을 사용하여 빌드할 수 있습니다. 파일의 이름은 정확한 상태 코드 또는 시리즈 마스크여야 합니다./error

예를 들어 정적 HTML 파일을 매핑하려면 디렉터리 구조는 다음과 같습니다.404

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

FreeMarker 템플릿을 사용하여 모든 오류를 매핑하려면 디렉터리 구조는 다음과 같습니다.5xx

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.ftlh
             +- <other templates>

보다 복잡한 매핑의 경우 다음 예제와 같이 인터페이스를 구현하는 빈을 추가할 수도 있습니다.ErrorViewResolver

public class MyErrorViewResolver implements ErrorViewResolver {

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request,
            HttpStatus status, Map<String, Object> model) {
        // Use the request or status to optionally return a ModelAndView
        return ...
    }

}

또한 @ExceptionHandler 방법 및 @ControllerAdvice 같은 일반 스프링 MVC 기능을 사용할 수 있습니다. 그런 다음 처리되지 않은 예외를 선택합니다.ErrorController

스프링 MVC 외부의 오류 페이지 매핑

Spring MVC를 사용하지 않는 응용 프로그램의 경우 인터페이스를 사용하여 직접 등록할 수 있습니다. 이 추상화는 기본 임베디드 서베렛 컨테이너와 직접 작동하며 스프링 MVC가 없는 경우에도 작동합니다.ErrorPageRegistrarErrorPagesDispatcherServlet

@Bean
public ErrorPageRegistrar errorPageRegistrar(){
    return new MyErrorPageRegistrar();
}

// ...

private static class MyErrorPageRegistrar implements ErrorPageRegistrar {

    @Override
    public void registerErrorPages(ErrorPageRegistry registry) {
        registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
    }

}
  저지 및 위켓과 같은 스프링이 아닌 웹 프레임워크에서 일반적으로 처리되는 경로로 등록하는 경우 다음 예제와 같이 디스패처로 명시적으로 등록해야 합니다. ErrorPageFilterFilterERROR
@Bean
public FilterRegistrationBean myFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new MyFilter());
    ...
    registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
    return registration;
}

기본값에는 디스패처 유형이 포함되어 있지 않습니다.FilterRegistrationBeanERROR

전쟁 배치에서 오류 처리

서책자 컨테이너에 배포할 때 Spring Boot는 오류 페이지 필터를 사용하여 오류 상태의 요청을 적절한 오류 페이지로 전달합니다. 이는 Servlet 사양이 오류 페이지를 등록하기 위한 API를 제공하지 않으므로 필요합니다. 전쟁 파일을 배포하는 컨테이너와 응용 프로그램에서 사용하는 기술에 따라 몇 가지 추가 구성이 필요할 수 있습니다.

오류 페이지 필터는 응답이 아직 커밋되지 않은 경우에만 요청을 올바른 오류 페이지로 전달할 수 있습니다. 기본적으로 WebSphere 응용 프로그램 서버 8.0은 나중에 servlet의 서비스 메서드가 성공적으로 완료되면 응답을 커밋합니다. 로 설정하여 이 동작을 비활성화해야 합니다.com.ibm.ws.webcontainer.invokeFlushAfterServicefalse

Spring Security를 사용하고 오류 페이지에서 주체에 액세스하려면 오류 디스패치에 호출할 스프링 보안 필터를 구성해야 합니다. 이렇게 하려면 속성을 로 설정합니다.spring.security.filter.dispatcher-typesasync, error, forward, request

봄 의 증오

하이퍼미디어를 사용하는 RESTful API를 개발하는 경우 스프링 부트은 대부분의 응용 프로그램과 잘 어울리는 Spring HATEOAS에 대한 자동 구성을 제공합니다. 자동 구성은 여러 개의 원두를 사용하고 등록하여 하이퍼미디어 기반 응용 프로그램 구축(클라이언트 측 지원용)과 원하는 표현에 대한 응답을 올바르게 마샬링하도록 구성된 구성을 포함합니다. 다양한 속성을 설정하거나, 존재하는 경우, 콩에 의해 사용자 정의됩니다.@EnableHypermediaSupportLinkDiscoverersObjectMapperObjectMapperspring.jackson.*Jackson2ObjectMapperBuilder

당신은 사용하여 봄 HATEOAS의 구성을 제어 할 수 있습니다 . 이렇게 하면 이전에 설명한 사용자 지정이 비활성화됩니다.@EnableHypermediaSupportObjectMapper

CORS 지원

CORS(원산지 간 리소스 공유)는 대부분의 브라우저에서 구현한 W3C 사양으로 IFRAME 또는 JSONP와 같이 덜 안전하고 덜 강력한 접근 방식을 사용하는 대신 어떤 종류의 교차 도메인 요청이 승인되는지 유연하게 지정할 수 있습니다.

버전 4.2에서 스프링 MVC는 CORS를 지원합니다. 스프링 부트 응용 프로그램에서 @CrossOrigin 주석이 있는 컨트롤러 방법 CORS 구성을 사용하면 특정 구성이 필요하지 않습니다. 글로벌 CORS 구성은 다음 예제와 같이 사용자 지정된 메서드로 콩을 등록하여 정의할 수 있습니다.WebMvcConfigureraddCorsMappings(CorsRegistry)

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}

4.7.2. "봄 웹플럭스 프레임워크"

Spring WebFlux는 스프링 프레임워크 5.0에 도입된 새로운 반응형 웹 프레임워크입니다. 스프링 MVC와 달리 Servlet API가 필요하지 않으며 완전히 비동기적이며 차단되지 않으며 Reactor 프로젝트를 통해 반응스트림 사양을 구현합니다.

봄 웹플럭스는 기능성과 성문 기반의 두 가지 맛으로 제공됩니다. 다음 예제와 같이 송어 기반 은 스프링 MVC 모델에 매우 가깝습니다.

@RestController
@RequestMapping("/users")
public class MyRestController {

    @GetMapping("/{user}")
    public Mono<User> getUser(@PathVariable Long user) {
        // ...
    }

    @GetMapping("/{user}/customers")
    public Flux<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
    }

    @DeleteMapping("/{user}")
    public Mono<User> deleteUser(@PathVariable Long user) {
        // ...
    }

}

기능 변형인 "WebFlux.fn"은 다음과 같은 예제와 같이 라우팅 구성을 요청의 실제 처리와 분리합니다.

@Configuration(proxyBeanMethods = false)
public class RoutingConfiguration {

    @Bean
    public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
        return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
                .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
                .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
    }

}

@Component
public class UserHandler {

    public Mono<ServerResponse> getUser(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> deleteUser(ServerRequest request) {
        // ...
    }
}

WebFlux는 스프링 프레임워크의 일부이며 자세한 정보는 참조 문서에서확인할 수 있습니다.

  라우터의 정의를 모듈화하려는 만큼 원두를 정의할 수 있습니다. 우선 순위를 적용해야 하는 경우 콩을 주문할 수 있습니다. RouterFunction

시작하려면 응용 프로그램에 모듈을 추가합니다.spring-boot-starter-webflux

  응용 프로그램에 모듈과 모듈을 모두 추가하면 웹플럭스가 아닌 스프링 MVC를 자동으로 구성하는 스프링 부트이 생성됩니다. 많은 Spring 개발자가 스프링 MVC 응용 프로그램에 추가하여 반응성을 사용하기 때문에 이 동작이 선택되었습니다. 선택한 응용 프로그램 유형을 로 설정하여 선택 사항을 적용할 수 있습니다. spring-boot-starter-webspring-boot-starter-webfluxspring-boot-starter-webfluxWebClientSpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)
스프링 웹플럭스 자동 구성

스프링 부트은 대부분의 응용 프로그램과 잘 작동하는 스프링 웹플럭스에 대한 자동 구성을 제공합니다.

자동 구성은 Spring의 기본 값 위에 다음과 같은 기능을 추가합니다.

스프링 부트 웹플럭스 기능을 유지하려는 경우 WebFlux 구성을추가하려면 고유한 유형 클래스를 추가할 수 있지만.@ConfigurationWebFluxConfigurer@EnableWebFlux

스프링 웹플럭스를 완벽하게 제어하려면 .@Configuration@EnableWebFlux

HTTP 코덱스 와 httpMessageReaders 및 httpMessageWriters

Spring WebFlux는 HTTP 요청 및 응답을 변환하기 위해 및 인터페이스를 사용합니다. 클래스경로에서 사용할 수 있는 라이브러리를 확인하여 합리적인 기본값을 갖도록 구성됩니다.HttpMessageReaderHttpMessageWriterCodecConfigurer

스프링 부트은 코덱에 대한 전용 구성 속성을 제공합니다. 또한 인스턴스를 사용하여 추가 사용자 지정을 적용합니다. 예를 들어 구성 키는 Jackson 코덱에 적용됩니다.spring.codec.*CodecCustomizerspring.jackson.*

코덱을 추가하거나 사용자 지정해야 하는 경우 다음 예제와 같이 사용자 지정 구성 요소를 만들 수 있습니다.CodecCustomizer

import org.springframework.boot.web.codec.CodecCustomizer;

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {

    @Bean
    public CodecCustomizer myCodecCustomizer() {
        return codecConfigurer -> {
            // ...
        };
    }

}
정적 콘텐츠

기본적으로 스프링 부트은 클래스 경로에서 (또는) 라는 디렉토리의 정적 콘텐츠를 제공합니다. 스프링 웹플럭스(Spring WebFlux)에서 직접 추가하고 메서드를 재정의하여 해당 동작을 수정할 수 있습니다./static/public/resources/META-INF/resourcesResourceWebHandlerWebFluxConfigureraddResourceHandlers

기본적으로 리소스는 매핑되지만 속성을 설정하여 리소스를 조정할 수 있습니다. 예를 들어 다음과 같이 수행할 모든 리소스를 재배치할 수 있습니다./**spring.webflux.static-path-pattern/resources/**

spring.webflux.static-path-pattern=/resources/**

또한 를 사용하여 정적 리소스 위치를 사용자 지정할 수도 있습니다. 이렇게 하면 기본 값을 디렉터리 위치 목록으로 바꿉다. 이렇게 하면 기본 환영 페이지 검색이 사용자 지정 위치로 전환됩니다. 따라서 시작 시 위치에 있는 경우 응용 프로그램의 홈 페이지입니다.spring.resources.static-locationsindex.html

이전에 나열된 "표준" 정적 리소스 위치 외에도 Webjars 콘텐츠에대한 특별한 사례가 만들어집니다. 경로가 있는 모든 리소스는 Webjars 형식으로 패키지된 경우 jar 파일에서 제공됩니다./webjars/**

  Spring WebFlux 응용 프로그램은 Servlet API에 엄격하게 의존하지 않으므로 전쟁 파일로 배포할 수 없으며 디렉터리를 사용하지 않습니다. src/main/webapp
웰컴 페이지

스프링 부트은 정적 및 템플릿 환영 페이지를 모두 지원합니다. 먼저 구성된 정적 콘텐츠 위치에서 파일을 찾습니다. 찾을 수 없는 경우 템플릿을 찾습니다. 둘 중 하나를 발견하면 응용 프로그램의 환영 페이지로 자동으로 사용됩니다.index.htmlindex

템플릿 엔진

REST 웹 서비스뿐만 아니라 스프링 웹플럭스를 사용하여 동적 HTML 콘텐츠를 제공할 수도 있습니다. 스프링 웹플렉스는 타임리프, 프리마커, 콧수염 등 다양한 템플릿 기술을 지원합니다.

스프링 부트에는 다음 템플릿 엔진에 대한 자동 구성 지원이 포함됩니다.

기본 구성이 있는 이러한 템플릿 엔진 중 하나를 사용하면 템플릿을 에서 자동으로 선택합니다.src/main/resources/templates

오류 처리

스프링 부트은 모든 오류를 합리적인 방식으로 처리하는 것을 제공합니다. 처리 순서에서의 위치는 마지막으로 간주되는 WebFlux에서 제공하는 처리기 바로 앞에 있습니다. 컴퓨터 클라이언트의 경우 오류, HTTP 상태 및 예외 메시지에 대한 세부 정보가 있는 JSON 응답을 생성합니다. 브라우저 클라이언트의 경우 HTML 형식으로 동일한 데이터를 렌더링하는 "화이트라벨" 오류 처리기가 있습니다. 또한 오류를 표시하기 위해 자신의 HTML 템플릿을 제공할 수도 있습니다(다음 섹션참조).WebExceptionHandler

이 기능을 사용자 지정하는 첫 번째 단계는 종종 기존 메커니즘을 사용하지만 오류 내용을 대체하거나 보강하는 것입니다. 이를 위해 형식의 빈을 추가할 수 있습니다.ErrorAttributes

오류 처리 동작을 변경하려면 해당 유형의 bean 정의를 구현하고 등록할 수 있습니다. A는 레벨이 매우 낮기 때문에 스프링 부트은 다음 예제와 같이 WebFlux 기능적 방식으로 오류를 처리할 수 있도록 하는 편리한 기능을 제공합니다.ErrorWebExceptionHandlerWebExceptionHandlerAbstractErrorWebExceptionHandler

public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {

    // Define constructor here

    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {

        return RouterFunctions
                .route(aPredicate, aHandler)
                .andRoute(anotherPredicate, anotherHandler);
    }

}

보다 완벽한 그림을 원하면 직접 하위 클래스를 만들고 특정 메서드를 재정의할 수도 있습니다.DefaultErrorWebExceptionHandler

사용자 지정 오류 페이지

지정된 상태 코드에 대한 사용자 지정 HTML 오류 페이지를 표시하려면 디렉터리에 파일을 추가할 수 있습니다. 오류 페이지는 정적 HTML(즉, 정적 리소스 디렉터리 아래에 추가) 또는 템플릿으로 빌드될 수 있습니다. 파일의 이름은 정확한 상태 코드 또는 시리즈 마스크여야 합니다./error

예를 들어 정적 HTML 파일을 매핑하려면 디렉터리 구조는 다음과 같습니다.404

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

콧수염 템플릿을 사용하여 모든 오류를 매핑하려면 디렉터리 구조는 다음과 같습니다.5xx

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.mustache
             +- <other templates>
웹 필터

Spring WebFlux는 HTTP 요청 응답 교환을 필터링하기 위해 구현할 수 있는 인터페이스를 제공합니다. 응용 프로그램 컨텍스트에서 발견되는 원두는 자동으로 각 교환을 필터링하는 데 사용됩니다.WebFilterWebFilter

필터의 순서가 중요한 경우 구현하거나 에 추가 할 수 있습니다. 스프링 부트 자동 구성은 웹 필터를 구성할 수 있습니다. 이렇게 하면 다음 표에 표시된 주문이 사용됩니다.Ordered@Order

웹 필터 순서

MetricsWebFilter

Ordered.HIGHEST_PRECEDENCE + 1

WebFilterChainProxy (봄 보안)

-100

HttpTraceWebFilter

Ordered.LOWEST_PRECEDENCE - 10

4.7.3. JAX-RS 및 저지

REST 끝점에 대한 JAX-RS 프로그래밍 모델을 선호하는 경우 스프링 MVC 대신 사용 가능한 구현 중 하나를 사용할 수 있습니다. 저지와 아파치 CXF는 상자 에서 아주 잘 작동합니다. CXF는 응용 프로그램 컨텍스트에 등록하거나 응용 프로그램 컨텍스트에 로 등록해야 합니다. 저지는 네이티브 스프링 지원을 제공하므로 스프링 부트에서 스타터와 함께 자동 구성 지원을 제공합니다.ServletFilter@Bean

저지를 시작하려면 종속성으로 포함한 다음 다음 예제와 같이 모든 끝점을 등록하는 유형 중 하나가 필요합니다.spring-boot-starter-jersey@BeanResourceConfig

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(Endpoint.class);
    }

}
  실행 가능한 아카이브 스캔에 대한 저지의 지원은 다소 제한적입니다. 예를 들어 완전히 실행 가능한 항아리 파일이나 실행 가능한 전쟁 파일을 실행할 때 발견된 패키지의 끝점을 검사할 수 없습니다. 이러한 제한을 피하기 위해 메서드를 사용 해서는 안 되며 앞의 예제와 같이 메서드를 사용하여 끝점을 개별적으로 등록해야 합니다. WEB-INF/classespackagesregister

고급 사용자 지정을 위해.ResourceConfigCustomizer

등록된 모든 끝점은 다음 예제와 같이 HTTP 리소스 주석(및 기타)이어야 합니다.@Components@GET

@Component
@Path("/hello")
public class Endpoint {

    @GET
    public String message() {
        return "Hello";
    }

}

스프링이기 때문에 스프링에 의해 수명 주기가 관리되며 별표기를 사용하여 종속성을 주입하고 어기를 사용하여 외부 구성을 주입할 수 있습니다. 기본적으로 저지 서번이 등록되어 매핑됩니다. .에 추가하여 매핑을 변경할 수 있습니다.Endpoint@Component@Autowired@Value/*@ApplicationPathResourceConfig

기본적으로 저지는 명명된 형식의 Servlet로 설정됩니다. 기본적으로 서슬릿은 느리게 초기화되지만. 같은 이름으로 자신의 콩을 만들어 해당 콩을 비활성화하거나 재정의할 수 있습니다. 설정하여 서버렛 대신 필터를 사용할 수도 있습니다(이 경우 교체 또는 재정의할 수 있음). 필터에는 설정할 수 있는 가이. 속성 맵을 지정하는 데 사용하여 서브릿과 필터 등록모두 인바이트 매개 변수를 부여할 수 있습니다.@BeanServletRegistrationBeanjerseyServletRegistrationspring.jersey.servlet.load-on-startupspring.jersey.type=filter@BeanjerseyFilterRegistration@Orderspring.jersey.filter.orderspring.jersey.init.*

4.7.4. 임베디드 서베렛 컨테이너 지원

스프링 부트에는 임베디드 톰캣, 부두언더토우 서버에 대한 지원이 포함되어 있습니다. 대부분의 개발자는 적절한 "시작"을 사용하여 완전히 구성된 인스턴스를 얻습니다. 기본적으로 임베디드 서버는 포트에서 HTTP 요청을 수신 대기합니다.8080

서블릿, 필터 및 리스너

임베디드 서블릿 용기를 사용하는 경우 스프링 빈을 사용하거나 Servlet 구성 요소를 스캔하여 서블릿 사양에서 서블릿, 필터 및 모든 수신기(예:)를 등록할 수 있습니다.HttpSessionListener

서블릿, 필터 및 리스너를 스프링 빈으로 등록

스프링 콩인 모든 또는 서브릿 인스턴스는 임베디드 컨테이너에 등록되어 있습니다. 구성 중에 값을 참조하려는 경우 특히 편리할 수 있습니다.ServletFilter*Listenerapplication.properties

기본적으로 컨텍스트에 단일 Servlet만 포함되어 있는 경우 매핑됩니다. 여러 서브릿 콩의 경우 콩 이름은 경로 접두사로 사용됩니다. 로 맵을 필터링합니다.//*

규칙 기반 매핑이 충분히 유연하지 않은 경우 전체 제어를 위해 및 클래스를 사용할 수 있습니다.ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean

필터 콩을 주문하지 않은 상태로 두는 것이 일반적으로 안전합니다. 특정 순서가 필요한 경우 에 이에 대해 추가하거나 구현해야 합니다. bean 메서드에 해당 메서드에 대해 인칭하여 순서를 구성할 수 없습니다. 추가 하거나 구현 하는 클래스를 변경할 수 없는 경우 에 대 한 을 정의 하 고 메서드를 사용 하 여 등록 콩의 순서를 설정 해야 합니다. 응용 프로그램의 문자 인코딩 구성과 다를 수 있으므로 요청 본문을 읽는 필터를 구성하지 마십시오. Servlet 필터가 요청을 감싸는 경우 보다 적거나 동일한 순서로 구성해야 합니다.Filter@OrderOrderedFilter@OrderFilter@OrderOrderedFilterRegistrationBeanFiltersetOrder(int)Ordered.HIGHEST_PRECEDENCEOrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER

  응용 프로그램의 모든 순서를 보려면 로깅 그룹에 대한 디버그 수준 로깅을 사용하도록 설정합니다(). 그런 다음 주문 및 URL 패턴을 포함하여 등록된 필터의 세부 정보가 시작 시 기록됩니다. Filterweblogging.level.web=debug
  그들은 응용 프로그램 수명에서 매우 일찍 초기화되기 때문에 콩을 등록 할 때주의하십시오. 다른 콩과 상호 작용하는 등록을 해야 하는 경우 대신 위임 필터프록시등록빈을 사용하는 것이 좋습니다. FilterFilter
서스렛 컨텍스트 초기화

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

스프링 부트 응용 프로그램에서 servlet 컨텍스트 초기화를 수행해야 하는 경우 인터페이스를 구현하는 빈을 등록해야 합니다. 단일 메서드는 에 대한 액세스를 제공하며 필요한 경우 기존 어댑터로 쉽게 사용할 수 있습니다.org.springframework.boot.web.servlet.ServletContextInitializeronStartupServletContextWebApplicationInitializer

서블릿, 필터 및 리스너용 스캔

임베디드 컨테이너를 사용하는 경우, 에 추가된 클래스의 자동 등록을 활성화하고, 사용하여 활성화할 수 있다.@WebServlet@WebFilter@WebListener@ServletComponentScan

  @ServletComponentScan 대신 컨테이너의 내장 검색 메커니즘을 사용하는 독립실행형 컨테이너에는 아무런 효과가 없습니다.
서베렛웹서버애플리케이션컨텍스트

후드 아래에서 스프링 부트은 임베디드 서베렛 컨테이너 지원에 다른 유형의 사용됩니다. 하나의 콩을 검색하여 부트 스트랩 의 특별한 유형입니다. 일반적으로 또는 자동 구성되었습니다.ApplicationContextServletWebServerApplicationContextWebApplicationContextServletWebServerFactoryTomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory

  일반적으로 이러한 구현 클래스를 인식할 필요가 없습니다. 대부분의 응용 프로그램은 자동으로 구성되며, 적절하고, 귀하의 대신하여 만들어집니다. ApplicationContextServletWebServerFactory
임베디드 서블렛 컨테이너 사용자 지정

스프링 속성을 사용하여 공통 서서비스 컨테이너 설정을 구성할 수 있습니다. 일반적으로 파일의 속성을 정의합니다.Environmentapplication.properties

일반적인 서버 설정은 다음과 같습니다.

  • 네트워크 설정: 들어오는 HTTP 요청(), 인터페이스 주소에 바인딩할 포트 등을 들어보세요.server.portserver.address
  • 세션 설정: 세션이 영구(), 세션 시간(), 세션 데이터 위치() 및 세션 쿠키 구성()인지 여부입니다.server.servlet.session.persistentserver.servlet.session.timeoutserver.servlet.session.store-dirserver.servlet.session.cookie.*
  • 오류 관리: 오류 페이지의 위치(등) 등입니다.server.error.path
  • Ssl
  • HTTP 압축

스프링 부트은 가능한 한 많은 시도를 하여 공통 설정을 노출하지만 항상 가능한 것은 아닙니다. 이러한 경우 전용 네임스페이스는 서버별 사용자 지정(참조 및 참조)을 제공합니다. 예를 들어 임베디드 서슬릿 컨테이너의 특정 피쳐로 액세스 로그를 구성할 수 있습니다.server.tomcatserver.undertow

  전체 목록은 ServerProperties 클래스를 참조하십시오.
프로그래밍 방식 사용자 지정

임베디드 서슬릿 컨테이너를 프로그래밍 방식으로 구성해야 하는 경우 인터페이스를 구현하는 스프링 빈을 등록할 수 있습니다. 수많은 사용자 지정 세터 메서드를 포함하는 에 대한 액세스를 제공합니다. 다음 예제에서는 프로그래매틱 포트 설정이 표시됩니다.WebServerFactoryCustomizerWebServerFactoryCustomizerConfigurableServletWebServerFactory

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, 그리고 그 전용 변형은 각각 Tomcat, Jetty 및 Undertow에 대한 추가 사용자 정의 세터 방법을 가지고 있습니다. JettyServletWebServerFactoryUndertowServletWebServerFactoryConfigurableServletWebServerFactory
구성 가능한 웹 서버팩토리 직접 사용자 정의

위의 사용자 지정 기술이 너무 제한되어 있는 경우 직접 등록하거나 직접 등록할 수 있습니다.TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory

@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;
}

세터는 많은 구성 옵션에 대해 제공됩니다. 몇 가지 보호 된 방법 "후크"는 또한 더 이국적인 일을해야하는 경우 제공됩니다. 자세한 내용은 소스 코드 설명서를 참조하십시오.

JSP 제한 사항

임베디드 서블릿 컨테이너를 사용하는 스프링 부트 응용 프로그램을 실행할 때(실행 가능한 아카이브로 패키지됨) JSP 지원에는 몇 가지 제한이 있습니다.

  • 부두와 톰캣과 함께, 전쟁 포장을 사용하는 경우 작동해야합니다. 실행 가능한 전쟁은 발사 시 작동하며 표준 컨테이너에도 배포할 수 있습니다. 실행 가능한 항아리를 사용할 때 JSP는 지원되지 않습니다.java -jar
  • Undertow는 JSP를 지원하지 않습니다.
  • 사용자 지정 페이지를 만들면 오류 처리에대한 기본 보기를 재정의하지 않습니다. 대신 사용자 지정 오류 페이지를 사용해야 합니다.error.jsp

4.7.5. 임베디드 반응형 서버 지원

스프링 부트에는 반응기 쐐기풀, 톰캣, 부두 및 언더토우 : 다음과 같은 임베디드 반응 웹 서버에 대한 지원이 포함되어 있습니다. 대부분의 개발자는 적절한 "시작"을 사용하여 완전히 구성된 인스턴스를 얻습니다. 기본적으로 임베디드 서버는 포트 8080에서 HTTP 요청을 수신 대기합니다.

4.7.6. 반응형 서버 리소스 구성

Reactor Netty 또는 Jetty 서버를 자동 구성할 때 스프링 부트은 서버 인스턴스에 HTTP 리소스를 제공하는 특정 원두를 만듭니다.ReactorResourceFactoryJettyResourceFactory

기본적으로 이러한 리소스는 원자로 쐐기및 부두 클라이언트와 공유되어 최적의 성능을 제공합니다.

  • 서버 및 클라이언트에 동일한 기술이 사용됩니다.
  • 클라이언트 인스턴스는 스프링 부트에 의해 자동으로 구성된 콩을 사용하여 빌드됩니다.WebClient.Builder

개발자는 사용자 지정 또는 빈을 제공하여 부두 및 Reactor Netty의 리소스 구성을 재정의할 수 있습니다.ReactorResourceFactoryJettyResourceFactory

WebClient 런타임 섹션에서클라이언트 측의 리소스 구성에 대해 자세히 알아볼 수 있습니다.

 

 

Spring Boot Reference Documentation

Phillip 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 Frederick

2.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.

출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications

반응형