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

chaelynjang님의 프로필 이미지

작성한 질문수

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

Context의 특징

inner sequence context 관련 질문

해결된 질문

24.09.03 14:09 작성

·

15

0

안녕하세요 강사님 좋은 강의 감사드립니다.

해당 영상에서 예제 코드가 잘 이해가 되지 않아 질문 남깁니다. inner Sequence 내부에서 Context에 저장된 데이터를 외부에서 읽을 수 없다면 subscribe할 때 Context에 저장된 job은 inner 시퀀스에서 저장한 것이므로 읽을 수 없어야 한다고 생각이 들었습니다. 근데 실행 결과에서는 job에 대한 데이터를 잘 읽어오길래 혼란이 왔습니다.

제가 아직 리액티브 프로그래밍 동작 방식이 익숙치 않아서 그런데 확인해주시고 부연 설명해주시면 정말 감사드리겠습니다.

@Slf4j
public class ContextFeatureExample4 {
    public static void main(String[] args) throws InterruptedException {
        String key1 = "id";
        Mono.just("Kevin")
                // flatMap 내부: inner Sequence
                .flatMap(name -> Mono.deferContextual(ctx ->
                        Mono.just(ctx.get(key1) + ", " + name)
                                .transformDeferredContextual((mono, innerCtx) -> mono.map(data -> data + ", " + innerCtx.get("job")))
                                .contextWrite(context -> context.put("job", "Software Engineer"))
                        )
                )
                .publishOn(Schedulers.parallel())
                .contextWrite(context -> context.put(key1, "itVillage"))
                .subscribe(data -> log.info("onNext = {}", data));

        Thread.sleep(100L);
    }
}

답변 1

1

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

2024. 09. 03. 17:05

안녕하세요.

Context 동작 방식이 좀 헷갈리시죠? ^^;

이해하기 힘드실까봐 코드에 그림을 잠깐 그려봤습니다.

K-020.png

(1)번 같은 경우에는 Inner Sequence에서 외부 시퀀스를 읽는 것이므로 정상적으로 itvillage라는 값을 읽어옵니다.
(2)번 같은 경우에는 Inner Sequece 안에서 내부 시퀀스를 읽는 것이므로 역시 정상적으로 Software Engineer라는 값을 읽어오구요. 만약에 Inner Sequence 내부의 컨텍스트를 Inner Sequence 바깥 쪽에서 읽으면 값을 읽을 수 없습니다.

Inner Sequence 내부에서 읽어서 다시 emit을 해 버리기 때문에 출력이 되는건데 값이 출력이 되어 버리니까 더 헷갈리셨던것 같네요.


강의 영상에서 네 번째 예제 코드 뒷쪽 설명 부분에 가면 외부에서 Inner Sequence 내부에 있는 컨텍스트를 읽을 수 없는 부분에 대해서 설명 드리고 있으니 참고하시면 될 것 같아요.

 

답변이 되셨으면 좋겠습니다.

감사합니다.

 

 

 

chaelynjang님의 프로필 이미지
chaelynjang
질문자

2024. 09. 04. 09:53

아아 emit해서 출력이 되는 거였군요 이해됐습니다 감사합니다 🙂 !!