토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 부트 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


7.9. RSocket

RSocket은 바이트 스트림 전송에 사용하는 바이너리 프로토콜이다. 단일 커넥션으로 비동기 메세지를 전송해서 대칭 상호작용 모델symmetric interaction model을 활성화한다.

스프링 프레임워크의 spring-messaging 모듈은 클라이언트, 서버 양측에서 RSocket requester, responder를 지원한다. RSocket 프로토콜을 자세히 알고 싶다면 개요를 함께 다루는 스프링 프레임워크 레퍼런스의 RSocket 섹션을 참고해라.

7.9.1. RSocket Strategies Auto-configuration

스프링 부트는 RSocket 페이로드를 인코딩, 디코딩하는 데 필요한 모든 인프라를 RSocketStrategies 빈으로 자동 설정해준다. 자동 설정에선 기본적으로 상황에 따라 아래 설정들을 추가한다 (순서대로):

  1. Jackson을 사용한 CBOR 코덱
  2. Jackson을 사용한 JSON 코덱

spring-boot-starter-rsocket 스타터는 두 가지 의존성을 모두 제공한다. 커스텀이 가능한지 알아 보려면 Jackson 지원 섹션을 확인해봐라.

RSocketStrategies 컴포넌트는 RSocketStrategiesCustomizer 인터페이스를 구현한 빈을 생성하면 재정의할 수 있다. @Order가 코덱의 순서를 결정하기 때문에 주의해서 봐야한다.

7.9.2. RSocket server Auto-configuration

스프링 부트는 RSocket 서버 자동 설정을 지원한다. 필요한 의존성은 spring-boot-starter-rsocket으로 제공한다.

스프링 부트를 사용하면 웹플럭스 서버에서 WebSocket을 통해 RSocket을 노출하거나, 독립적인 RSocket 서버를 띄울 수 있다. 이는 애플리케이션 타입과 설정에 따라 다르다.

웹플럭스 애플리케이션에선 (ex. WebApplicationType.REACTIVE 타입), 다음과 같은 프로퍼티를 사용할 때만 RSocket 서버를 웹 서버에 연결한다.

properties yaml
spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket
spring:
  rsocket:
    server:
      mapping-path: "/rsocket"
      transport: "websocket"

RSocket은 자체 라이브러리로 빌드하기 때문에, RSocket을 웹 서버에 연결하는 방식은 Reactor Netty에서만 지원한다.

그 외엔 RSocket TCP나 websocket 서버를 독립적인 임베디드 서버로 시작한다. 의존성 외에 유일하게 필요한 설정은 서버 포트 정의다:

properties yaml
spring.rsocket.server.port=9898
spring:
  rsocket:
    server:
      port: 9898

7.9.3. Spring Messaging RSocket support

스프링 부트는 RSocket을 위한 스프링의 메세지 처리 인프라를 자동으로 설정해준다.

즉, 애플리케이션으로 들어오는 RSocket 요청을 처리해줄 RSocketMessageHandler 빈을 스프링 부트에서 생성한다는 뜻이다.

7.9.4. Calling RSocket Services with RSocketRequester

서버와 클라이언트 간에 RSocket 채널이 구축되고 나면, 양 쪽 모두 상대방에게 요청을 보낼 수도, 받을 수도 있다.

서버로 사용할 땐 RSocket @Controller에 있는 모든 핸들러 메소드에 RSocketRequester 인스턴스를 주입할 수 있다. 클라이언트로 사용할 땐 먼저 RSocket 커넥션을 설정해 줘야 한다. 스프링 부트는 이럴 때 필요할만한 RSocketRequester.Builder를 코덱과 함께 자동으로 설정해준다.

RSocketRequester.Builder 인스턴스는 프로토타입 빈으로, 주입하는 곳마다 매번 새 인스턴스를 제공한다. 이렇게 설계한 이유는 이 빌더는 상태를 가지고 있으며stateful, 다른 설정을 가진 requester를 생성할 땐 같은 인스턴스를 사용하면 안 되기 때문이다.

다음은 RSocketRequester를 사용하는 전형적인 예시다:

@Service
public class MyService {

    private final RSocketRequester rsocketRequester;

    public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
        this.rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898);
    }

    public Mono<User> someRSocketCall(String name) {
        return this.rsocketRequester.route("user").data(name).retrieveMono(User.class);
    }

}

전체 목차는 여기에 있습니다.

<< >>

TOP