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

[Spring WebFlux] Reactive Streaming 데이터 처리

꾸준함. 2024. 10. 8. 09:47

개요

Spring WebFlux는 SSE(Server-Sent Events)를 이용해 데이터를 Streaming 할 수 있습니다.

SSE는 spring 4.2 버전부터 지원되었으며 Spring 5 버전부터 Reactor의 Publisher 타입인 Flux를 이용해 조금 더 편리한 방법으로 SSE를 사용할 수 있게 되었습니다.

 

SSE

  • 서버가 클라이언트에게 단방향 스트리밍으로 데이터를 전송하는 방식
    • WebSocket은 양방향 통신이 가능한 기술이지만 SSE는 단방향

 

  • 클라이언트는 한 번 연결을 수립한 후 서버에서 발생하는 이벤트나 업데이트를 지속적으로 받아볼 수 있으며 주로 실시간 데이터 전송이 필요한 애플리케이션에서 사용됨
  • SSE는 기존의 HTTP 프로토콜 위에서 동작하고 웹 브라우저에서 표준적으로 제공되며, text/event-stream MIME 타입을 사용하여 서버에서 지속적으로 데이터를 클라이언트로 스트리밍
  • SSE는 주로 작은 양의 데이터를 지속적으로 전송하는 경우에 적합
    • 일반적인 HTTP 요청과 응답 방식보다 더 적은 리소스를 사용하여 서버-클라이언트 간 연결을 유지
    • 한 번 연결을 맺으면, 여러 개의 요청을 필요로 하지 않기 때문에 성능적으로 유리

 

보다 자세한 내용은 https://jaimemin.tistory.com/2575 참고 부탁드립니다.

 

[Spring WebFlux] Server Sent Event

서론SSE(Server-Sent Events)를 완벽히 이해하기 위해서는 먼저 Polling, Long Polling, 그리고 HTTP Streaming과 같은 기술적 개념들의 이해가 선행되어야 합니다.언급한 기술들은 서버와 클라이언트 간의 통신

jaimemin.tistory.com

 

Reactive Streaming 코드 예시

 

1. Reactive Streaming을 위한 BookRouter

 

 

 

코드 설명

  • BookService에서 반환되는 Flux<Book>을 respone body로 전송하기 위한 BookRouter 코드
  • 클라이언트로부터 전송되는 요청을 라우팅하기 위해 RequestPredicates의 GET() 메서드를 통해 파라미터로 지정한 request URI에 매치되는 요청을 라우팅
  • SSE를 이용해 이벤트 스트림을 클라이언트로 전송하기 위해서는 Content Type이 `text/event-stream`이어야 하기 때문에 코드에서는 MediaType.TEXT_EVENT_STREAM을 지정
  • body() 메서드를 통해 ServerResponse의 response body를 bookService.streamingBooks()에서 반환하는 Flux<Book>으로 지정
    • map() Operator로 Book 객체를 BookDeto.Response 객체로 반환했기 때문에 ServerResponse의 response body는 최종적으로 Flux<BookDto.Response>가 됨
    • body() 메서드의 두 번째 파라미터는 emit되는 데이터 타입을 지정하는데 여기서는 response body가 Flux<BookDto.Response>이므로 BookDto.Response.class로 지정

 

2. Reactive Streaming 데이터 수신을 위한 클라이언트

 

 

 

코드 설명

  • Reactive Streaming 데이터를 수신하기 위한 클라이언트 역할을 수행하는 BookWebClient 코드
  • WebClient를 이용해 Streaming 데이터를 수신하기 위해서는 위 코드와 같이 bodyToFlux() 메서드를 이용해야 함
    • bodyToFlux()의 파라미터로는 수신한 데이터를 디코딩할 데이터 타입 지정 (BookDto.Response)

 

  • 수신한 응답을 구독해 서버 측에서 전송하는 도서 정보를 로그로 출력

 

참고

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

반응형