개요
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 참고 부탁드립니다.
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)
- 수신한 응답을 구독해 서버 측에서 전송하는 도서 정보를 로그로 출력
참고
스프링으로 시작하는 리액티브 프로그래밍 (황정식 저자)
반응형
'Spring > 스프링으로 시작하는 리액티브 프로그래밍' 카테고리의 다른 글
[Spring WebFlux] WebClient (0) | 2024.10.07 |
---|---|
[Spring WebFlux] 예외 처리 (0) | 2024.09.16 |
Spring Data R2DBC 간단 정리 (0) | 2024.09.11 |
[Spring WebFlux] 함수형 엔드포인트(Functional Endpoint) (0) | 2024.09.06 |
[Spring WebFlux] 애너테이션 기반 컨트롤러 (0) | 2024.08.20 |