매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

Spring/Webflux

Context

blockbuddy93 2024. 3. 1. 13:51

Context란?

  • Reactor Sequence 상에서 상태를 저장할 수 있고, 저장된 상태 값을 Operator 체인에서 공유해서 사용할 수 있는 인터페이스이다.
  • Context 에 저장할 상태 값은 key, value 형태로 저장된다.
  • Context에 값을 저장하기 위해서는 contextWrite()을 사용한다.
  • Context에서 값을 읽어오기 위해서는 읽기 전용 뷰인 ContextView를 사용한다.
  • ContextView는 Reactor Sequence에서 deferContextual() 또는 transformDeferredContextual()을 통해서 제공된다.

 

Mono<String> mono = Mono.deferContextual(ctx ->
    Mono.just("Hello" + " " + ctx.get(key)).doOnNext(Logger::doOnNext)
  )
  .subscribeOn(Schedulers.boundedElastic())
  .publishOn(Schedulers.parallel())
  .transformDeferredContextual((mono2, ctx) -> mono2.map(data -> data + " " + ctx.get(key)))
  .contextWrite(context -> context.put(key, "Reactor"));

mono.subscribe(Logger::onNext);

 

자주 사용되는 Context API

put(key, value) : key/value 형태로 Context 에 값을 쓴다

Context.of(Key1, value1, key2, value2, ...) : key/value 형태로 Context 에 여러개의 값을 쓴다

putAll(ContextView) : 입력된 ContextView를 merge 한다.

delete(key) : Context에서 key에 해당하는 value를 삭제한다.

 

자주 사용되는 ContextView API

get(key) : ContextView 에서 key에 해당하는 value를 반환한다.

getOrEmpty(key) : ContexxtView에서 kkey에 해당하는 value를 Optional로 래핑해서 반환한다.

getOrDefault(key, default value) : ContextView 에서 key에 해당하는 value를 가져온다. key에 해당하는 value가 없으면 default value를 가져온다.

hashKey(key) : ContextView에서 특정 key가 존재하는지를 확인한다.

isEmpty() : Context가 비어있는지 확인한다.

size() : Context내에 있는 key/value의 개수를 반환한다.

 

Context 의 특징

- Context 는 각각의 subscriber를 통해 Reactor Sequence에 연결되며 체인에 각각 Operator들이 실행 쓰레드가 달라도 연결된 Context에 접근할 수 있다.

- Context는 체인의 맨 아래에서부터 위로 전파된다.

-    Context는 Downstream 에서 Upstream으로 전파된다.

-    Operator 체인에서 Context read 메서드가 Context wirte 메서드 밑에 있을 경우에는 write 된 값을 read할 수 없다.

-    따라서 일반적으로 Contex에 write 할 때는 Operator 체인의 마지막에 둔다.

- 동일한 키에 대해서 write 할 경우, 값을 덮어쓴다.

- 메인 Operator 내부에서 Sequence를 생성하는 flatMap() 같은 Operator 내에서 wirte 된 Context 값은 Inner Sequence 내부에서만 유효하고, 외부 Operator 체인에서는 보이지 않는다. 

 

 

'Spring > Webflux' 카테고리의 다른 글

Reactive Programming 2  (0) 2024.03.01
Reactive Programming  (0) 2024.03.01
Scheduler의 종류  (0) 2024.02.29
Scheduler  (0) 2024.02.29
Sinks  (0) 2024.02.29