인프런 커뮤니티 질문&답변

gguu님의 프로필 이미지

작성한 질문수

Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부

Context란?

.contextWrite의 실행시점

23.11.26 16:31 작성

·

422

1

안녕하세요

예제 코드에서 질문이 있습니다.

@SneakyThrows
public static void main(String[] args) {
    String key = "message";
    Mono<String> mono = Mono.deferContextual(ctx -> Mono.just("Hello" + " " + ctx.get(key))
                                                        .doOnNext(msg -> log.info("context value : {}", msg)))
        .subscribeOn(Schedulers.boundedElastic())
        .publishOn(Schedulers.parallel())
        .transformDeferredContextual((mono2, ctx) -> mono2.map(data -> data + " " + ctx.get(key)))
        .contextWrite(context -> context.put(key, "Reactor")).doOnNext(msg -> log.info("contextWrite value : {}", msg));

    mono.subscribe(data -> log.info("data : {}", data));
    Thread.sleep(100L);
}

 

설명하시는 내용을 들어보면 코드의 순서와 상관없이

.contextWrite()

이 먼저 발생하여 context에 {message, Reactor} 값을 저장하고

Mono.deferContextual

가 실행되어 ctx에서 contextWrite에서 했던 값을 가져오고 있습니다.

 

이부분이 잘 이해가 안가는데요

그전 강의까지는 `.subscribeOn`, `.publishOn` 이런 메서드의 체이닝은 탑다운 방식으로 진행되었었는데
Context부터는 순서가 달라 혹시 실행하는 우선순위가 있는지 궁금합니다.

 

답변 1

2

Kevin님의 프로필 이미지
Kevin
지식공유자

2023. 11. 26. 22:19

안녕하세요?

Context에 담긴 정보를 Downstream에서 Upstream으로 전파해서 사용하는 방식이 이해가 안되신다는 질문으로 이해 했습니다.

 

Context를 어떤 용도로 쓰느냐에 따라서 보는 관점이 달라질 것 같긴한데 Reactor 공식 문서를 보면 Context는 Subscriber의 구독 메커니즘과 연결이 되어 있고, 구독이 발생했다는 signal(subscription signal)이 upstream으로 이동하는것과 같은 방식으로 Context에 wirte을 할 수 있다라는 설명이 예시를 통해 나와 있습니다.

 

다만, 왜 Context를 꼭 아래에서 위로 전파하는지에 대한 이유를 명시적으로 설명하고 있지는 않습니다.

 

대신에 어느 정도 유추를 해 볼 수는 있는데요.

 

Context에는 주로 인증 정보나 환경 설정 값 등 직교 정보(orthogonal information)가 저장되는 직교성을 가지는 이런 정보들은 주로 데이터 소스를 가져올 때 사용될 수 있습니다.

데이터 소스는 최상위 Upstream에서 주로 가져올텐데 최상위 Upstream에서 Context의 최신 정보를 이용하기 위해서는 아무래도 아래쪽에서 위로 전파된 최신 Context를 이용하는게 자연스러울꺼라 생각합니다.

 

참고로 여기서 말하는 직교 정보는 Subscriber 당 하나씩 연결된 독립적인 Context에 저장된 정보로 보시면 될 것 같습니다.

gguu님의 프로필 이미지

작성한 질문수

질문하기