[Web on Reactive Stack] 5. RSocket: 5.4. MetadataExtractor

한글로 번역한 Web on Reactive Stack, 5. RSocket: 5.4. MetadataExtractor


5.4. MetadataExtractor

응답자는 메타 데이터를 해석해야 한다. Composite metadata는 각각 고유한 mime 타입으로 포맷팅된 메타 데이터 값(예를 들면, 라우팅, 보안, 추적)을 허용한다. 애플리케이션은 지원할 메타 데이터 mime 타입을 설정하고, 추출된 값에 접근하는 방법이 필요하다.

MetadataExtractor는 직렬화된 메타 데이터를 받아와서 디코딩한 이름-값(name-value) 쌍을 반환한다. 이 값은 헤더처럼 이름으로 접근할 수 있다. 예를 들면, 핸들러 메서드에 적용된 @Header

DefaultMetadataExtractor에 메타 데이터를 디코딩하기 위한 Decoder를 설정할 수 있다. 기본적으로 String으로 디코딩하여 “route” 키에 저장하는 “message/x.rsocket.routing.v0” 에 대한 지원 기능이 내장되어 있다. 다른 mime 타입의 경우 Decoder를 제공하고 다음과 같이 mime 타입을 등록해야 한다.

Java:

DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(fooMimeType, Foo.class, "foo");

Kotlin:

import org.springframework.messaging.rsocket.metadataToExtract

val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Foo>(fooMimeType, "foo")

복합 메타 데이터(Composite metadata)는 독립적인 메타 데이터 값을 결합하는데 효과적이다. 하지만 요청자(requester)가 복합 메타 데이터를 지원하지 않거나 사용하지 않을 수 있다. 이를 위해서 DefaultMetadataExtractor는 디코딩한 값을 출력 map에 매핑하는 커스텀 로직이 필요하다. 다음은 메타 데이터에 JSON을 사용하는 예제다:

Java:

DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(
    MimeType.valueOf("application/vnd.myapp.metadata+json"),
    new ParameterizedTypeReference<Map<String,String>>() {},
    (jsonMap, outputMap) -> {
        outputMap.putAll(jsonMap);
    });

Kotlin:

import org.springframework.messaging.rsocket.metadataToExtract

val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Map<String, String>>(MimeType.valueOf("application/vnd.myapp.metadata+json")) { jsonMap, outputMap ->
    outputMap.putAll(jsonMap)
}

RSocketStrategies를 사용하여 MetadataExtractor를 설정할 때는, RSocketStrategies.Builder에서 설정된 디코더로 추출자(extractor)를 생성할 수 있다. 그리고 콜백을 사용하여 다음과 같이 등록 작업을 커스텀할 수 있다.

Java:

RSocketStrategies strategies = RSocketStrategies.builder()
    .metadataExtractorRegistry(registry -> {
        registry.metadataToExtract(fooMimeType, Foo.class, "foo");
        // ...
    })
    .build();

Kotlin:

import org.springframework.messaging.rsocket.metadataToExtract

val strategies = RSocketStrategies.builder()
        .metadataExtractorRegistry { registry: MetadataExtractorRegistry ->
            registry.metadataToExtract<Foo>(fooMimeType, "foo")
            // ...
        }
        .build()

목차 가이드


댓글을 남기시려면 Github 로그인을 해주세요 :D


Hi, there!

Thanks for visiting my blog.
Please let me know if there are any mistakes in my post.