IT/Spring

[리액티브 API] 비동기 웹 프레임워크, WebFlux

김 정 환 2022. 7. 26. 22:48
반응형

 

스프링 MVC와 같은 Servlet 기반의 웹 프레임워크는 요청이 처리될 때 스레드 풀에서 작업 스레드를 가져와서 해당 요청을 처리하고, 작업 스레드가 종료될 때까지 요청 스레드를 블로킹합니다. 따라서 블로킹 웹 프레임워크는 요청량의 증가에 따른 확장이 어렵습니다. 요즘 같이 사람들이 빈번하게 컨텐츠를 소비하고, IoT가 끊임없이 API 통신을 하게되면 확장성이 부각됩니다.

 

비동기 웹 프레임워크는 적은 수의 스레드로 높은 확장성을 성취합니다. 이벤트 루핑(event looping) 기법으로 한 스레드당 많은 요청을 처리할 수 있습니다. 이벤트 루프에서는 모든 것이 이벤트로 처리됩니다. 이벤트 루프는 요청 작업의 콜백을 등록하여 병행으로 처리하게 하고 다른 이벤트 처리로 넘어갑니다. 그리고 작업이 완료되면 완료 작업도 이벤트로 처리됩니다. 결과적으로 적은 수의 스레드로 많은 요청을 처리할 수 있어서 스레드 관리 부담이 줄어들고 확장이 용이합니다.

 

 

 

스프링 MVC에서 리액티브 웹 프레임워크를 결심한 것이 WebFlux입니다. WebFlux는 비동기적인 새로운 웹 프레임워크 입니다. 스프링 MVC는 다중 스레드에 의존해서 다수의 요청을 처리하는 서블릿 기반의 웹 프레임워크인데 반대, 스프링 WebFlux는 요청이 이벤트 루프로 처리되는 진정한 리액티브 웹 프레임워크 입니다. 코드로 둘의 차이점을 보겠습니다.

 

첫 번째 코드는 블로킹입니다. postTaco()가 Taco 객체를 받을 때에는 요청 페이로드를 분석하여 Taco 객체를 생성하는 블로킹 작업이 하나 필요합니다. 그 뒤에 save() 메소드의 블로킹되는 호출이 끝나고 나서야 postTaco()가 끝납니다. 두 번의 블로킹이 되었습니다.

//blocking
@PostMapping(consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Taco postTaco(@RequestBody Taco taco){
    return tacoRepo.save(taco);
}

 

두 번째 코드는 논블로킹입니다. saveAll()은 Mono<Taco>를 인자로 받으므로 postTaco()로 들어온 Taco 객체는 분석되는 것을 기다리지 않고 즉시 호출됩니다. 그리고 레포지토리 또한 리액티브이므로 Mono를 받아 즉시 Flux<Taco>를 반환합니다. 이 Flux<Taco>를 next() 호출에서 Mono<Taco>로 반환합니다.

//non-blocking
@PostMapping(consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Mono<Taco> postTaco(@RequestBody Mono<Taco> tacoMono){
    return tacoRepo.saveAll(tacoMono).next();
}

 

반응형

'IT > Spring' 카테고리의 다른 글

[spring core] Databuffer  (0) 2022.08.20
[리액티브 API] WebClient 개요와 사용법  (0) 2022.07.26
[리액터] 리액터 사용하기  (0) 2022.07.11
[리액터] 리액터 개요  (0) 2022.07.11
Spring boot와 MariaDB를 JPA로 연동  (0) 2022.03.20