Spring/스프링으로 시작하는 리액티브 프로그래밍

[Spring WebFlux] 애너테이션 기반 컨트롤러

꾸준함. 2024. 8. 20. 00:55

컨트롤러 관점에서 Spring MVC vs Spring WebFlux

 

1. Spring MVC Controller

  • @RequestBody 애너테이션을 지정해서 클라이언트의 요청 데이터를 전달받고, ResponseEntity 클래스를 이용해 응답 데이터를 클라이언트에게 전달하는 전형적인 Spring MVC 기반 Controller

 

 

2. Spring WebFlux Controller

  • 겉보기에는 단순히 Mono와 Flux로 wrapping 한 것처럼 보이지만 non-blocking을 지원하는 리액티브 핸들러
  • 애너테이션 기반의 프로그래밍 모델은 기존의 Spring MVC 구조와 거의 흡사하게 사용할 수 있음

 

 

Spring WebFlux 기반의 컨트롤러 사용 시 주의할 점

 

1. Repository/Service 계층에서 블로킹 메서드 사용 여부 확인

  • Spring WebFlux에서 논블로킹 방식으로 동작하려면, Repository나 Service 계층에서도 논블로킹 방식으로 동작해야 함
    • 즉, Spring Data R2DBC, Spring Data Reactive MongoDB, Spring Data Cassandra 등 non-blocking 리액티브 라이브러리를 사용해야 함
    • ex) JPA 기반의 Repository 메서드는 기본적으로 blocking 이기 때문에, Spring WebFlux 환경에서는 적합하지 않으며 대신, R2DBC 또는 리액티브 MongoDB를 사용하는 것이 좋음

 

2. 블로킹 I/O 사용 여부 확인

  • 파일 읽기/쓰기, 네트워크 호출, 데이터베이스 쿼리 등에서 블로킹 I/O가 사용되지 않도록 해야 함
    • 이러한 작업은 WebFlux에서 제공하는 non-blocking 방식의 API를 사용해야 함
    • 만약 blocking 작업이 필요한 경우, 별도의 쓰레드 풀에서 해당 작업을 처리하도록 Schedulers.boundedElastic() 등을 사용하여 분리해야 함

 

3. 블로킹 메서드 호출 여부 확인

  • Thread.sleep(), blockingQueue.take(), blockingQueue.put() 등의 blocking 메서드를 호출하지 않아야 함
    • 위 메서드들은 논블로킹 방식의 처리 흐름을 방해할 수 있음

 

4. Mono/Flux의 block() 메서드 사용 금지

  • WebFlux에서는 Mono.block() 또는 Flux.block()과 같은 메서드를 호출하지 않도록 주의해야 함
    • 위 메서드들은 비동기 흐름을 동기식으로 변환하며, blocking 동작을 일으킴

 

참고

  • 스프링으로 시작하는 리액티브 프로그래밍 (황정식 저자)
반응형