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()
๋ชฉ์ฐจ ๊ฐ์ด๋