Spring 5 WebFlux의 @Controller와 라우터의 기능 차이
현재 스프링5에서 HTTP 엔드포인트를 공개하는 방법은 두 가지가 있습니다.
@Controller
★★★★★★★★★★★★★★★★★」@RestController
예를 들어 컨트롤러 클래스를 만듭니다.
@RestController
@RequestMapping("persons")
public class PersonController {
@Autowired
private PersonRepo repo;
@GetMapping("/{id}")
public Mono<Person> personById(@PathVariable String id){
retrun repo.findById(id);
}
}
- 「」의
@Configuration
Router Functions:
@Bean
public RouterFunction<ServerResponse> personRoute(PersonRepo repo) {
return route(GET("/persons/{id}"), req -> Mono.justOrEmpty(req.pathVariable("id"))
.flatMap(repo::getById)
.flatMap(p -> ok().syncBody(p))
.switchIfEmpty(notFound().build()));
}
다른 접근 방식을 사용하는 경우 성능 차이가 있습니까?원서를 처음부터 작성할 때 어떤 것을 사용해야 하나요?
프로그래밍 패러다임:필수와 기능
「」의 @Controller
★★★★★★★★★★★★★★★★★」@RestController
주석은 매핑에 주석을 사용하고(및 그뿐만 아니라) 결과적으로 (기능적인 세계에서는 허용되지 않는) API를 작동시키기 위해 주석을 사용하는 주석 기반 모델에 동의합니다. 수 있다@Valid
요청 또는 "Bean "에 빈 합니다.@RequestMapping
전체 컨트롤러의 루트 경로를 지정합니다.
에서는 API 체인에 합니다.「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 。router -> handler
이 두 가지는 일련의 이벤트와 두 명의 주인공, 퍼블리셔와 서브스크라이버 등 기본적인 리액티브 블록 구축에 매우 적합합니다.
MVC 레거시:서블릿 스택과 Netty 스택
이 얘기를 할 때론@Controller
우리는 보통 동기 자바 세계의 관점에서 생각할 것입니다.Servlets
,ServletContext
,ServletContainerInitializer
,DispatcherServlet
타타를 입니다. 당사가 복귀하더라도Mono
로 하기 위해 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Servlet 3.0
「」를 서포트java.nio.*
합니다.Jetty
★★★★★★★★★★★★★★★★★」Tomcat
그 후, 여기에서는, 대응하는 디자인 패턴과 어프로치를 사용해 Web 앱을 구축합니다.
RouterFunction
한편, 비동기 Java 세계에서 유래한 진정한 사후 대응적 접근법 - Netty와 Netty에서 영감을 받았습니다.Channel Model
.
이후 사후 대응 환경을 위한 새로운 클래스 집합과 API가 등장했습니다.ServerRequest, ServerResponse, WebFilter 등.저는 Spring 팀이 프레임워크 유지 보수와 새로운 웹 시스템 요구 사항 이해에 따라 설계한 것입니다.이러한 요건의 이름은 사후 대응 선언입니다.
사용 사례
최근 저희 팀은 Swagger와 통합이 불가능하다는 문제에 직면했습니다.RouterFucntion
엔드 포인트의 표를 얻을 수 있습니다.@Controlers
그러나 Spring 팀은 대응형 WebTestClient에 쉽게 연결할 수 있는 솔루션인 Spring REST Docs를 발표했습니다.여기서 'connected'라는 단어를 사용하는 이유는 Swagger의 오버로드된 구성과 부작용 주석을 사용하는 대신 작업 코드를 전혀 건드리지 않고 쉽게 API 문서를 테스트에서 쉽게 작성할 수 있기 때문입니다.
업데이트 2020: Spring Webflux는 이후 Open을 사용하여 Swagger와 통합될 수 있습니다.API 사양은 아직 구성의 단순성과 투명성이 결여되어 있기 때문에 제가 보기에 오래된 MVC 접근법의 일부입니다.
마감(의견)
퍼포먼스에 영향이 없는 이유에서는, 「사용하는 것은 개인의 기호에 근거하고 있다」와 같은 소리가 들리기 쉽습니다.두 가지 선택지 중 하나는 개인의 취향이라는 것입니다.앞으로 나아가는 것과 10년 동안 같은 영역에 머물러 있을 때 뒤로 물러나는 것 중 하나입니다.제 생각엔 이 문제에 대한 사후적인 지원은@Controller
Spring 팀이 실시한 것은 오래된 프로젝트가 어떻게든 시간 요건에 부합하고 적어도 이행의 기회를 가질 수 있도록 하기 위해서입니다.웹 어플리케이션을 처음부터 작성하려면 주저하지 말고 도입된 사후 대응형 스택을 사용하십시오.
비록 조금 늦었지만, 이것은 미래의 독자들에게 유용할 것이다.
기능 루트 선언으로 전환하면 다음과 같이 됩니다.
- 모든 라우팅 Configuration을 한 곳에서 유지
- 수신요구 파라미터, 경로변수 및 요청의 기타 중요한 컴포넌트에 대한 접근과 관련하여 일반적인 주석 기반 접근 방식과 거의 동일한 유연성을 얻을 수 있습니다.
- Spring Framework 인프라스트럭처 전체가 실행되지 않도록 함으로써 애플리케이션의 부트스트래핑 시간을 단축할 수 있습니다.
포인트 3에 관해서는 스프링 생태계의 기능(IoC, 주석 처리, 자동 구성) 전체가 중복되어 어플리케이션의 전체 기동 시간이 단축되는 경우가 있습니다.
소규모 마이크로 서비스, Amazon Lambdas 및 유사한 클라우드 서비스 시대에 개발자는 거의 동일한 프레임워크 기능을 갖춘 경량 애플리케이션을 만들 수 있는 기능을 제공하는 것이 중요합니다.이것이 Spring Framework 팀이 이 기능을 WebFlux 모듈에 통합하기로 결정한 이유입니다.
새로운 기능성 웹 프레임워크에서는 Spring 인프라스트럭처 전체를 시작하지 않고 웹 애플리케이션을 구축할 수 있습니다.main
그 경우의 방법은 다음과 같아야 한다(주의: 없다).@SpringBootApplication
□□□□□□□□★
class StandaloneApplication {
public static void main(String[] args) {
HttpHandler httpHandler = RouterFunctions.toHttpHandler(
routes(new BCryptPasswordEncoder(18))
);
ReactorHttpHandlerAdapter reactorHttpHandler = new ReactorHttpHandlerAdapter(httpHandler);
HttpServer.create()
.port(8080)
.handle(reactorHttpHandler)
.bind()
.flatMap(DisposableChannel::onDispose)
.block();
}
static RouterFunction<ServerResponse> routes(PasswordEncoder passwordEncoder ) {
return
route(
POST("/check"),
request -> request
.bodyToMono(PasswordDTO.class)
.map(p -> passwordEncoder
.matches(p.getRaw(), p.getSecured()))
.flatMap(isMatched -> isMatched
? ServerResponse
.ok()
.build()
: ServerResponse
.status(HttpStatus.EXPECTATION_FAILED)
.build()
)
);
}
}
언급URL : https://stackoverflow.com/questions/47092029/difference-between-controller-and-routerfunction-in-spring-5-webflux
'programing' 카테고리의 다른 글
Wordpress가 웹 루트에 설치되어 있는 하위 디렉토리에서 Joomla 웹 사이트를 실행하는 방법 (0) | 2023.03.18 |
---|---|
WP_Ajax_UnitTestCase가 WPAjaxDieStopException을 슬로우하지 않음 (0) | 2023.03.18 |
리액트 라우터 허가 (0) | 2023.03.18 |
부모의 범위에 액세스하는 사용자 지정 하위 지시문 (0) | 2023.03.18 |
ng-repeat 내의 ng-click 함수에 파라미터를 추가하는 것이 동작하지 않는 것 같습니다. (0) | 2023.03.18 |