Loading...
Spring Framework Reference Documentation 7.0.2의 DispatcherHandler의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
DispatcherHandlerSee equivalent in the Servlet stack
Spring WebFlux는 Spring MVC와 마찬가지로 프론트 컨트롤러 패턴을 중심으로 설계되어 있으며,
중앙 WebHandler인 DispatcherHandler가 요청 처리을 위한 공통 알고리즘을 제공하고,
실제 작업은 설정 가능한 delegate 컴포넌트들이 수행합니다.
이 모델은 유연하며 다양한 워크플로를 지원합니다.
DispatcherHandler는 필요한 delegate 컴포넌트를 Spring 설정에서 검색합니다.
또한 자체가 Spring 빈이 되도록 설계되어 있으며, 자신이 동작하는 컨텍스트에 접근하기 위해
ApplicationContextAware를 구현합니다. 만약 DispatcherHandler가 빈 이름 webHandler로
선언되면, 이는
WebHttpHandlerBuilder에
의해 검색되며, 이는
WebHandler API에 설명된 대로
요청 처리 체인을 구성합니다.
WebFlux 애플리케이션의 Spring 설정에는 일반적으로 다음이 포함됩니다:
webHandler인 DispatcherHandlerWebFilter와 WebExceptionHandler 빈DispatcherHandler 특수 빈다음 예제에서 볼 수 있듯이, 설정은 처리 체인을 빌드하기 위해
WebHttpHandlerBuilder에 제공됩니다:
1ApplicationContext context = ... 2HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();Copied!
1val context: ApplicationContext = ... 2val handler = WebHttpHandlerBuilder.applicationContext(context).build()Copied!
결과로 생성된 HttpHandler는
서버 어댑터에서 사용할 준비가 된 상태입니다.
See equivalent in the Servlet stack
DispatcherHandler는 요청을 처리하고 적절한 응답을 렌더링하기 위해 특수 빈에 위임합니다.
“특수 빈”이란 WebFlux 프레임워크 계약을 구현하는 Spring에서 관리되는 Object 인스턴스를 의미합니다.
이들은 보통 내장 계약을 제공하지만, 해당 프로퍼티를 커스터마이즈하거나 확장하거나 교체할 수 있습니다.
다음 표는 DispatcherHandler에 의해 검색되는 특수 빈을 나열합니다. 또한 더 낮은 수준에서
검색되는 다른 빈도 있다는 점에 유의하십시오 (Web Handler API의
Special bean types
를 참조하십시오).
| Bean type | Explanation |
|---|---|
HandlerMapping | 요청을 핸들러에 매핑합니다. 매핑은 일부 기준에 기반하며,<br>그 세부 내용은 HandlerMapping 구현마다 다릅니다. 예를 들어,<br>애노테이션 기반 컨트롤러, 단순 URL 패턴 매핑 등이 있습니다.<br>주요 HandlerMapping 구현은 @RequestMapping 애노테이션이 있는 메서드를 위한<br>RequestMappingHandlerMapping, 함수형 엔드포인트 라우트를 위한 RouterFunctionMapping,<br>URI 경로 패턴과 WebHandler 인스턴스를 명시적으로 등록하기 위한<br>SimpleUrlHandlerMapping입니다. |
HandlerAdapter | 핸들러가 실제로 어떻게 호출되는지와 관계없이, 요청에 매핑된 핸들러를<br>호출하도록 DispatcherHandler를 돕습니다. 예를 들어, 애노테이션 기반 컨트롤러를<br>호출하려면 애노테이션을 해석해야 합니다. HandlerAdapter의 주요 목적은<br>DispatcherHandler를 이러한 세부 사항으로부터 보호하는 것입니다. |
HandlerResultHandler | 핸들러 호출의 결과를 처리하고 응답을 마무리합니다.<br>Result Handling을 참조하십시오. |
See equivalent in the Servlet stack
애플리케이션은 요청을 처리하는 데 필요한 인프라스트럭처 빈
(Web Handler API와
DispatcherHandler에
나열된 빈)을 선언할 수 있습니다. 그러나 대부분의 경우
WebFlux Config가
가장 좋은 출발점입니다. 이는 필요한 빈을 선언하고 이를 커스터마이즈하기 위한 상위 수준의
설정 콜백 API를 제공합니다.
Spring Boot는 Spring WebFlux를 설정하기 위해 WebFlux 설정에 의존하며,<br>추가적인 많은 편의 옵션도 제공합니다.
See equivalent in the Servlet stack
DispatcherHandler는 다음과 같이 요청을 처리합니다:
HandlerMapping에 매칭되는 핸들러를 찾도록 요청하고, 첫 번째 매치를 사용합니다.HandlerAdapter를 통해 실행되며,
실행에서 반환된 값은 HandlerResult로 노출됩니다.HandlerResult는 적절한 HandlerResultHandler에 전달되어
응답에 직접 쓰거나 뷰를 사용해 렌더링함으로써 처리를 완료합니다.HandlerAdapter를 통해 핸들러를 호출한 반환 값은 추가 컨텍스트와 함께
HandlerResult로 래핑되어, 이를 지원한다고 주장하는 첫 번째
HandlerResultHandler에 전달됩니다. 다음 표는 사용 가능한
HandlerResultHandler 구현을 보여주며, 이들은 모두
WebFlux Config에
선언되어 있습니다:
| Result Handler Type | Return Values | Default Order |
|---|---|---|
ResponseEntityResultHandler | 일반적으로 @Controller 인스턴스에서 반환되는 ResponseEntity. | 0 |
ServerResponseResultHandler | 일반적으로 함수형 엔드포인트에서 반환되는 ServerResponse. | 0 |
ResponseBodyResultHandler | @ResponseBody 메서드 또는 @RestController 클래스에서의 반환 값을 처리합니다. | 100 |
ViewResolutionResultHandler | CharSequence, View,<br>Model, Map,<br>Rendering,<br>또는 기타 Object는 모델 속성으로 처리됩니다.<br>View Resolution도 참조하십시오. | Integer.MAX_VALUE |
See equivalent in the Servlet stack
HandlerAdapter 구현은 컨트롤러 메서드와 같은 요청 핸들러를 호출하는 과정에서
발생하는 예외를 내부적으로 처리할 수 있습니다. 그러나 요청 핸들러가 비동기 값을
반환하는 경우 예외가 지연될 수 있습니다.
HandlerAdapter는 자신이 반환하는 HandlerResult에 설정된 DispatchExceptionHandler로
예외 처리 메커니즘을 노출할 수 있습니다. 이것이 설정된 경우,
DispatcherHandler는 결과를 처리할 때도 이를 적용합니다.
HandlerAdapter는 또한 DispatchExceptionHandler를 구현하기로 선택할 수 있습니다. 이 경우
DispatcherHandler는 핸들러가 매핑되기 전에 발생하는 예외(예를 들어 핸들러 매핑 중에,
또는 더 이전 단계인 WebFilter에서)를 처리하기 위해 이를 적용합니다.
“Annotated Controller” 섹션의 Exceptions나 WebHandler API 섹션의 Exceptions도 참조하십시오.
See equivalent in the Servlet stack
뷰 리졸루션은 특정 뷰 기술에 종속되지 않고, HTML 템플릿과 모델을 사용해
브라우저에 렌더링할 수 있도록 해줍니다. Spring WebFlux에서 뷰 리졸루션은
ViewResolver 인스턴스를 사용해 String(논리적 뷰 이름을 나타냄)을 View 인스턴스에
매핑하는 전용
HandlerResultHandler를
통해 지원됩니다.
그런 다음 View가 응답을 렌더링하는 데 사용됩니다.
웹 애플리케이션은 이 사용 사례를 지원하기 위해 View rendering library를 사용해야 합니다.
See equivalent in the Servlet stack
ViewResolutionResultHandler에 전달되는 HandlerResult에는 핸들러의 반환 값과
요청 처리 중에 추가된 속성을 포함하는 모델이 들어 있습니다. 반환 값은
다음 중 하나로 처리됩니다:
String, CharSequence: 설정된 ViewResolver 구현 목록을 통해
View로 해석할 논리적 뷰 이름입니다.void: 요청 경로에서 앞과 뒤의 슬래시를 제거한 값을 기반으로 기본 뷰 이름을
선택하고, 이를 View로 해석합니다. 뷰 이름이 제공되지 않은 경우(예: 모델 속성이
반환된 경우)나 비동기 반환 값(예: Mono가 empty로 완료된 경우)에도 동일하게 동작합니다.Model, Map: 요청의 모델에 추가할 추가 모델 속성입니다.@ModelAttribute 애노테이션이 있는 경우는 예외입니다.모델은 Reactor나 RxJava와 같은 비동기, 리액티브 타입을 포함할 수 있습니다.
렌더링 이전에, AbstractView는 이러한 모델 속성을 구체 값으로 해석하고 모델을 업데이트합니다.
단일 값 리액티브 타입은 단일 값 또는 값이 없는 값(empty인 경우)으로 해석되며,
다중 값 리액티브 타입(예: Flux<T>)은 수집되어 List<T>로 해석됩니다.
뷰 리졸루션을 설정하는 것은 Spring 설정에 ViewResolutionResultHandler 빈을
추가하는 것만큼 간단합니다.
WebFlux Config는
뷰 리졸루션을 위한 전용 설정 API를 제공합니다.
Spring WebFlux와 통합된 뷰 기술에 대한 자세한 내용은 View Technologies를 참조하십시오.
See equivalent in the Servlet stack
뷰 이름에서 특별한 redirect: 프리픽스를 사용하면 리다이렉트를 수행할 수 있습니다.
UrlBasedViewResolver(및 그 서브클래스)는 이를 리다이렉트가 필요하다는 지시로 인식합니다.
뷰 이름의 나머지 부분은 리다이렉트 URL입니다.
이는 컨트롤러가 RedirectView 또는
Rendering.redirectTo("abc").build()를 반환한 것과 동일한 효과를 내지만,
이제 컨트롤러 자체는 논리적 뷰 이름 관점에서 동작할 수 있습니다.
redirect:/some/resource와 같은 뷰 이름은 현재 애플리케이션을 기준으로 한 상대 경로이며,
redirect:https://example.com/arbitrary/path와 같은 뷰 이름은 절대 URL로 리다이렉트합니다.
Servlet 스택과는 달리,<br>Spring WebFlux는 "FORWARD" 디스패치를 지원하지 않으므로, 결과적으로
forward:프리픽스는 지원되지 않습니다.
See equivalent in the Servlet stack
ViewResolutionResultHandler는 콘텐츠 협상을 지원합니다. 이는 요청 미디어 타입을
각 선택된 View가 지원하는 미디어 타입과 비교합니다. 요청된 미디어 타입을 지원하는 첫 번째
View가 사용됩니다.
JSON 및 XML과 같은 미디어 타입을 지원하기 위해 Spring WebFlux는
HttpMessageWriter를
통해 렌더링하는 특수 View인 HttpMessageWriterView를 제공합니다.
일반적으로 이러한 뷰는
WebFlux Configuration을
통해 기본 뷰로 설정합니다. 기본 뷰는 요청된 미디어 타입과 일치하는 경우 항상
선택되어 사용됩니다.
Reactive Core
Annotated Controllers