티스토리 뷰
RSocketRequester 개요
RSocketRequester는 Spring에서 RSocket 프로토콜을 활용한 네트워크 통신을 쉽게 구현할 수 있도록 제공하는 클래스입니다.
RSocket은 TCP, WebSocket, HTTP/2, QUIC 등의 다양한 전송 프로토콜을 지원하며, 기존의 HTTP와 다르게 양방향 통신과 리액티브 스트림을 기반으로 하는 특징이 있습니다.
Spring에서는 RSocketRequester를 사용하여 서버와 클라이언트 간의 효율적인 데이터 교환을 수행할 수 있습니다.
1. RSocket의 주요 특징
- 리액티브 스트림 지원: Spring WebFlux와 함께 사용할 수 있으며, 백프레셔(Backpressure) 기능을 지원합니다.
- 양방향 통신: 단순한 요청-응답 방식뿐만 아니라 스트리밍 및 양방향 메시징이 가능합니다.
- 다양한 전송 방식 지원: TCP, WebSocket, HTTP/2, QUIC 등을 통해 통신할 수 있습니다.
- 경량 프로토콜: 최소한의 네트워크 리소스로 높은 성능을 제공합니다.
2. RSocket 통신 패턴
RSocket은 총 4가지 패턴의 메시징 방식을 지원합니다.
통신 방식 설명 리턴 타입
Fire-and-Forget | 요청을 보내고 응답을 기다리지 않음 | Mono<Void> |
Request-Response | 요청을 보내고 하나의 응답을 받음 | Mono<T> |
Request-Stream | 요청을 보내고 여러 개의 응답을 받음 | Flux<T> |
Channel (Bidirectional Streaming) | 양방향 스트리밍을 수행 | Flux<T> |
3. RSocket 설정 및 사용 방법
1) 의존성 추가
Spring Boot에서 RSocket을 사용하려면 spring-boot-starter-rsocket을 추가해야 합니다.
Gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-rsocket'
}
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
2) RSocket 서버 구현
RSocket 서버는 특정 경로(Route)에서 클라이언트 요청을 처리할 수 있도록 설정합니다.
아래 예제에서는 @MessageMapping을 사용하여 요청-응답 및 스트리밍을 처리하는 방법을 보여줍니다.
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.List;
@Controller
public class RSocketServerController {
// 단일 요청-응답 (Request-Response)
@MessageMapping("request-response")
public Mono<String> requestResponse(String request) {
return Mono.just("Hello, " + request);
}
// 요청-스트리밍 (Request-Stream)
@MessageMapping("request-stream")
public Flux<String> requestStream(String request) {
List<String> responses = List.of("Item 1", "Item 2", "Item 3", "Item 4");
return Flux.fromIterable(responses).delayElements(Duration.ofSeconds(1));
}
// Fire-and-Forget (응답 없이 요청만)
@MessageMapping("fire-and-forget")
public Mono<Void> fireAndForget(String message) {
System.out.println("Received: " + message);
return Mono.empty();
}
}
설명
- @MessageMapping("request-response"): 단일 요청-응답 방식을 처리합니다.
- @MessageMapping("request-stream"): 스트리밍 방식으로 여러 개의 응답을 반환합니다.
- @MessageMapping("fire-and-forget"): Fire-and-Forget 방식으로 메시지를 수신하고 응답을 보내지 않습니다.
3) RSocket 서버 포트 설정 (application.yml)
spring:
rsocket:
server:
port: 7000
transport: tcp
4) RSocket 클라이언트 (RSocketRequester) 구현
클라이언트에서 RSocketRequester를 사용하여 서버에 요청을 보낼 수 있습니다.
Spring에서는 RSocketRequester.Builder를 사용하여 RSocket 서버에 쉽게 연결할 수 있습니다.
(1) RSocketRequester 빈 설정
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.rsocket.RSocketRequester;
@Configuration
public class RSocketClientConfig {
@Bean
public RSocketRequester rSocketRequester(RSocketRequester.Builder builder) {
return builder.tcp("localhost", 7000);
}
}
설명
- RSocketRequester.Builder를 사용하여 localhost:7000의 RSocket 서버에 연결합니다.
- 기본적으로 TCP를 사용하여 연결합니다.
(2) Fire-and-Forget 요청
import org.springframework.messaging.rsocket.RSocketRequester;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
public class RSocketClient {
private final RSocketRequester rSocketRequester;
public RSocketClient(RSocketRequester rSocketRequester) {
this.rSocketRequester = rSocketRequester;
}
public void sendFireAndForget(String message) {
rSocketRequester.route("fire-and-forget")
.data(message)
.send()
.subscribe();
}
}
설명
- route("fire-and-forget"): @MessageMapping("fire-and-forget")에 매핑됩니다.
- .data(message): 전송할 데이터를 설정합니다.
- .send(): Fire-and-Forget 요청을 전송하고, 응답을 기다리지 않습니다.
(3) Request-Response 요청
public Mono<String> sendRequestResponse(String request) {
return rSocketRequester.route("request-response")
.data(request)
.retrieveMono(String.class);
}
설명
- .retrieveMono(String.class): 단일 응답을 반환합니다.
(4) Request-Stream 요청
public Flux<String> sendRequestStream(String request) {
return rSocketRequester.route("request-stream")
.data(request)
.retrieveFlux(String.class);
}
설명
- .retrieveFlux(String.class): 여러 개의 응답을 받을 수 있는 Flux 스트림을 반환합니다.
4. RSocketRequester 주요 메서드
메서드 설명
route(String name) | 서버의 @MessageMapping과 연결 |
data(Object payload) | 요청에 포함할 데이터 설정 |
retrieveMono(Class<T> type) | 단일 응답 (Request-Response) |
retrieveFlux(Class<T> type) | 다중 응답 (Request-Stream) |
send() | Fire-and-Forget 요청 |
5. 정리
- RSocketRequester는 Spring에서 RSocket 기반의 네트워크 통신을 쉽게 처리할 수 있도록 도와주는 객체입니다.
- @MessageMapping을 사용하여 서버에서 요청을 처리할 수 있습니다.
- RSocketRequester를 사용하면 Fire-and-Forget, Request-Response, Request-Stream, Bidirectional Streaming을 모두 구현할 수 있습니다.
- Spring Boot에서는 RSocket 서버를 쉽게 설정할 수 있으며, 클라이언트에서도 RSocketRequester를 활용하여 RSocket 기반의 API 호출이 가능합니다.