[TIL] WebFlux, WebClient

2025-05-05 TIL

📝 TIL (Today I Learned)
🔗 원본 이슈: #50
📅 작성일: 2025-05-05
🔄 최종 수정: 2025년 05월 22일


🍀 새롭게 배운 것

WebFlux

RestTemplate로 작성했던 Gemini 통신 부분을 Webclient로 작성하려고 하니 공부해야 할 부분이 많았다. 일단 WebFlux를 공부하기 전에 관련 블로그 링크는 아래와 같아.

HttpURLConnection, RestTemplate, WebClient » 논블로킹 vs 비동기

  • Spring WebFlux

    • 비동기적으로 동작하는 논블로킹 방식으로, Client와 Server에서 reactive 스타일의 어플리케이션 개발을 도와주는 스프링 모듈

      • WebClientSpring WebFlux에서 HTTP Client로 사용되는 비동기 방식의 통신 도구
      • 기존의 RestTemplate과 달리, I/O 작업을 블로킹하지 않고 Mono, Flux를 통해 비동기 스트림 처리가 가능
    • 주요 특징

      • Netty 기반의 논블로킹 서버 구동 가능 (@EnableWebFlux로 설정)
      • 작은 요청에도 적은 리소스로 대응 가능해, 고성능 시스템에 적합
      • 데이터 처리 흐름이 Reactive Stream 기반으로 동작
    • 기본 구성 요소

      • Mono<T>: 0 또는 1개의 데이터를 비동기적으로 처리
      • Flux<T>: 0개 이상의 데이터를 스트림 형태로 처리
    • 예제 코드

      WebClient client = WebClient.builder()
          .baseUrl("https://api.example.com")
          .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .build();
      
      Mono<ResponseDto> response = client.post()
          .uri("/gemini")
          .bodyValue(requestDto)
          .retrieve()
          .bodyToMono(ResponseDto.class);
      

아직은 WebClient 내부 동작과 Mono/Flux 체계가 낯설지만, 기존 동기식 방식과 비교하면서 천천히 익히는 중. 테스트할 땐 .block()으로 동기화 가능하지만, 실제 운영 환경에선 꼭 지양해야 한다는 것도 기억!

나중에 제대로 정리해서 블로그 업데이트 예정