티스토리 뷰
11.1 Context란?
- 어떠한 상황에서 그 상황을 처리하기 위해 필요한 정보
- Reactor에서 Context의 정의
Operator 같은 Reactor 구성요소 간에 전파되는 key/value 형태의 저장소
- 전파 : Downstream에서 Upstream 체인상의 각 Operator가 해당 Context 정보를 동일하게 이용할 수 있음
- Reactor의 Context는 Subscriber와 매핑됨
- cf. ThreadLocal의 경우 실행 스레드와 매핑됨
- 즉, 구독이 발생할 때마다 해당 구독과 연결된 하나의 Context가 생김
public static void main(String[] args) throws InterruptedException {
Mono
.deferContextual(ctx ->
Mono
.just("Hello" + " " + ctx.get("firstName"))
.doOnNext(data -> log.info("# just doOnNext : {}", data))
)
.subscribeOn(Schedulers.boundedElastic())
.publishOn(Schedulers.parallel())
.transformDeferredContextual(
(mono, ctx) -> mono.map(data -> data + " " + ctx.get("lastName"))
)
.contextWrite(context -> context.put("lastName", "Jobs"))
.contextWrite(context -> context.put("firstName", "Steve"))
.subscribe(data -> log.info("# onNext: {}", data));
Thread.sleep(100L);
}
contextWrite()
Operator로 Context에 데이터 쓰기 작업을 할 수 있다.Context.put()
으로 Context에 데이터를 쓸 수 있다.deferContextual()
Operator로 Context에 데이터 읽기 작업을 할 수 있다.Context.get()
으로 Context에서 데이터를 읽을 수 있다.transformDeferredContextual()
Operator로 Operator 중간에서 Context에 데이터 읽기 작업을 수 있다.
11.2 자주 사용되는 Context 관련 API
- Context API (쓰기)
- put(key, value) : key/value 형태로 Context에 값을 쓴다.
- of(key1, value1, key2, value2, ...) : key/value 형태로 Context에 여러 개의 값을 쓴다.
- pulAll(ContextView) : 현재 Context와 파라미터로 입력된 ContextView를 merge한다.
- delete(key) : Context에서 key에 해당하는 value를 삭제한다.
- ContextView API (읽기)
- get(key) : ContextView에서 key에 해당하는 value를 반환한다.
- getOrEmpty(key) : ContextView에서 key에 해당하는 value를 Optional로 래핑해서 반환한다.
- getOrDefault(key, default value) : ContextView에서 key에 해당하는 value를 가져온다. key에 해당하는 value가 없으면 default value를 가져온다.
- hasKey(key) : ContextView에서 특정 key가 존재하는지를 확인한다.
- isEmpty() : Context가 비어 있는지 확인한다.
- size() : Context 내에 있는 key/value의 개수를 반환한다.
11.3 Context의 특징
- Context는 구독이 발생할 때마다 하나의 Context가 해당 구독에 연결된다.
- Context는 Operator 체인의 아래에서 위로 전파된다.
- 모든 Operator에서 Context에 저장된 데이터를 읽어올 수 있으려면
contextWrite()
을 Operator 체인의 맨 마지막에 둬야 한다. - 동일한 키에 대한 값을 중복해서 저장하면 Operator 체인에서 가장 위쪽에 위치한
contextWrite()
이 저장한 값으로 덮어쓴다.
- 모든 Operator에서 Context에 저장된 데이터를 읽어올 수 있으려면
- Inner Sequence 내부에서는 외부 Context에 저장된 데이터를 읽을 수 있다.
- Inner Sequence 외부에서는 Inner Sequence 내부 Context에 저장된 데이터를 읽을 수 없다.
- 인증 정보 같은 직교성(독립성)을 가지는 정보를 전송하는 데 적합하다.
'공부 > 스프링으로 시작하는 리액티브 프로그래밍' 카테고리의 다른 글
Chapter 12 | Debugging (0) | 2023.07.21 |
---|---|
Chapter 10 | Scheduler (0) | 2023.07.21 |
Chapter 09 | Sinks (0) | 2023.07.21 |
Chapter 08 | Backpressure (0) | 2023.07.21 |
Chapter 07 | Cold Sequence와 Hot Sequence (0) | 2023.07.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크