coroutine scope란 위에서 언급했 듯이 coroutine context를 포함한 coroutine을 실행하는 범위를 뜻한다.
springboot + kotlin 프로젝트로 구성도 많이하고 webflux + coroutine은 자연스런 구성일 것이다.
근데 개발하면서 coroutine scope를 별도로 지정해서 사용하지 않았는데, 위 구성시에는 내부적으로 어떻게 구성될까?
그럼 다시 본론으로 돌아가서 webflux + coroutine을 같이 사용하면 coroutine scope는 어떻게 되나?
val reactorDispatcher = Schedulers.parallel().asCoroutineDispatcher()
만약 reactor를 kotlin의 Dispatcher를 사용한다면 오히려 컨텍스트 단절이 생기면서 비효율적일 것이다.
| Dispatcher | 소속 | 스레드 종류 | 언제 쓰나 | 예시 Thread 이름 |
|---|---|---|---|---|
Dispatchers.Default | Kotlin 표준 | CPU-bound 풀 | CPU 연산 | DefaultDispatcher-worker-1 |
Dispatchers.IO | Kotlin 표준 | I/O용 풀 (확장형) | 블로킹 I/O | DefaultDispatcher-worker-5 |
| Reactor Dispatcher (Spring WebFlux 내부) | Reactor (Netty 기반) | 이벤트 루프 | Non-blocking 요청 처리 | reactor-http-nio-2 |
[HTTP 요청] → Reactor pipeline 시작
↓
Reactor Context -> CoroutineContext (bridge)
↓
suspend 함수 실행 (실제 스레드는 reactor-http-nio-#)
↓
suspend -> resume 시점도 동일 이벤트 루프에서 스케줄됨
suspend(함수 일시중단)의 기능을 kotlin은 coroutination이 reactor는 scheduler가 대신한다.
| 시점 | 이벤트 루프 스레드 상태 | 코루틴 상태 |
| -------------- | ---------------------- | ----------- |
| suspend 진입 전 | 코루틴 실행 중 | Active |
| suspend 시 | subscribe 등록 → 스레드 반환 | Suspended |
| I/O 완료 이벤트 수신 | Reactor가 resume 요청 스케줄 | Resuming |
| resume 이후 | 다시 같은 Reactor 스레드에서 실행 | Active (재개) |
webflux + coroutine을 사용하여 내부적으로 suspend 함수를 사용하더라도 CoroutineDispatcher를 감싼 형태의 Reactor 전용 dispatcher를 사용하고 그 근간은 netty의 이벤트 루프를 사용하여 동작된다.