ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring WebFlux와 Reactive Programming
    spring 2024. 7. 1. 14:12

    WebFlux는 Spring 5 에서 도입된 비동기 웹 프레임워크로, Reactive Programming을 기반으로 한다.

     

    Reactivce Programming은 데이터를 비동기적으로 처리하고, 필요할 때 데이터를 가공하며, backpressure 등의 개념을 통해 시스템의 안정성을 높이는 프로그래밍 기법이다.

     

    비동기 처리는 일반적으로 다음과 같은 방식으로 지원된다.

    1. Non_blolcking I/O
      • WebFlux는 Netty나 Servlet 3.1+ container와 같은 논블로킹 서버를 지원한다.
      • 이러한 서버 환경 덕분에 스레드가 블로킹 되지 않고 효율적으로 I/O 작업을 처리할 수 있다.
    2. 비동기 API
      • Mono와 Flux는 비동기 API를 제공한다. 예를 들어, 'Mono.fromCallable()'은 Callable을 비동기적으로 실행하고 결과를 Mono로 반환한다.
    3. 콜백 대신 연산자 사용
      • 전통적인 비동기 프로그래밍에서는 콜백을 사용하지만, ReactiveProgramming에서는 연산자를 사용하여 데이터를 처리한다. 예를들어, 'map()', 'flatMap()', 'filter()', 'zip()' 등의 연산자를 사용하여 비동기 데이터 흐름을 제어한다.
      • 'onErrorResume()', 'onErrorReturn()' 등의 연산자를 통해 비동기 데이터 흐름에서 발생하는 에러를 처리할 수 있다.
    4. backpressure
      • Flux는 데이터 스트림의 속도를 조절하여 소비자가 생산자의 데이터 생성 속도를 따라가지 못할 때 발생할 수 있는 문제를 해결한다.

    즉 Spring WebFlux란, 이러한 이러한 비동기 방식을 쉽게 구현할 수 있도록 도와주는 프레임워크이다.


    동기 vs 비동기

    위에서 Spring WebFlux에 관한 내용과 사용 이유에 대해서 간략하게 설명했다.
    그렇다면 그 이유인 비동기 처리 방식은 어떤 기준으로 선택하고, 어떤 주의점이 있을까?
    내 블로그에선 이에 관한 내용을 다룬 적이 없어서 이 기회에 다뤄본다.

    동기화는 요리사가 순서에 맞게 하나씩 요리하는 방식

    전채 요리, 수프, 생선 요리로 이어지는 코스 요리가 존재한다고 가정하자.
    동기화 방식은 요리사(스레드)가 전채 요리를 완성할 때 까지 수프, 생선 요리는 대기해야 한다. 전채 요리가 완성되서야 그 다음 요리인 수프의 조리를 시작한다.

    비동기화는 병렬적으로 요리하는 방식

    비동기화 방식에서 요리사는 여러 요리를 병렬적으로 처리할 수 있다.
    예를들어 수프를 조리하는 과정 중, 오랜 시간 끓인다거나 하는 잉여 시간이 발생할 수 있다.
    그렇다면 그 시간동안 다음 요리인 생선을 손질하는 작업을 함께 처리하여 효율적인 처리를 할 수 있다.

    의사 선택 기준

    동기

    1. 단순하고 빠른 작업
      • 단순 데이터 변환, 메모리 내에서의 간단한 계산
    2. 상태 관리가 중요한 작업
      • 트랜잭션 처리, 순차적인 데이터 처리가 필요한 작업
    3. 사용자 입력에 즉각적인 응답이 필요한 작업
      • 폼 입력 유효성 검사와 같이 바로 피드백을 제공해야 하는 경우

    비동기

    1. I/O 바운드 작업
      • HTTP 요청 처리, 파일 읽기/쓰기, 데이터베이스 쿼리
    2. 긴 시간이 걸리는 작업
      • 이미지/비디오 처리, 대규모 데이터 분석
    3. 병렬 처리가 가능한 작업
      • 여러 외부 서비스 호출, 배치 작업
    4. 사용자 인터페이스 반응성을 높이기 위한 작업
      • UI 쓰레드와 분리된 데이터 로깅
    5. 실시간 데이터 처리
      • 채팅 애플리케이션, 실시간 알림 시스템 등
Designed by Tistory.