티스토리 뷰

카테고리 없음

RSocketRequester 소개

행복[HappY] 2025. 3. 10. 12:55

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 호출이 가능합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함