inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Context란?

.contextWrite의 실행시점

684

gguu

작성한 질문수 5

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부터는 순서가 달라 혹시 실행하는 우선순위가 있는지 궁금합니다.

 

java spring project-reactor webflux

답변 1

2

Kevin

안녕하세요?

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

 

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

 

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

 

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

 

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

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

 

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

subscription signal 에 upstream 으로 이동하는 순서

0

90

2

Webflux의 Non-Blocking 특성에 대해 문의 드립니다.

1

213

3

Downstream Mono, Flux가 subscriber인가요?

0

160

1

source.next와 source.emit의 차이에 대한 질문입니다.

0

214

2

StepVerifier를 이용한 Testing (1) - expectNoEvent 에 관해서

2

233

1

backpressure latest 전략

0

243

2

StepVerifier를 이용한 Testing (1) 의 StepVerifiter 질문

0

231

1

[Scheduler의 종류 강의] Schedulers.newParallel 메서드에 관한 질문

0

209

2

Backpressure Drop 전략에서 다시 버퍼가 채워지는 시점에 대한 질문입니다.

0

167

2

Reactor 3부의 오픈 일정에 관해서 문의드립니다!

0

173

1

inner sequence context 관련 질문

0

139

1

boundedElastic 관련 질문

1

323

1

강의자료 관련 질문드립니다.

0

250

3

newBoundedElastic 에서 queue 에 쌓이는 룰

0

215

2

import com.itvillage.utils.Logger;

0

149

1

Interceptor에서 reactor Context 유지하는 방법

0

283

2

예시코드는 webflux의 이점보단 webclient의 이점 아닌가요?

3

361

1

advancedTimeBy와 thenAwait 사용 예시가 궁금합니다

0

205

1

context의 read, write의 실행 순서

0

263

2

DROP 전략과 LATEST 전략의 차이점이 무엇인가요?

3

637

3

백프레셔 전략 관련해서

1

309

1

Backpressure Example 코드 질문드립니다

0

259

2

Backpressure 전략

0

308

2

Flux 와 Mono

0

465

1