JVM 동시성 모델 이해하기 (8) – 총정리 — 언제 무엇을 선택할 것인가
JVM 동시성 8부작 시리즈의 마지막. Virtual Thread, Reactor, Coroutines 중 무엇을 선택할지 네 가지 질문으로 정리하고, 기술별 고유 강점과 흔한 오해를 짚는다.
관심 있는 기술에 대해 공유하고 일상의 이야기를 기록하고 있습니다.
JVM 동시성 8부작 시리즈의 마지막. Virtual Thread, Reactor, Coroutines 중 무엇을 선택할지 네 가지 질문으로 정리하고, 기술별 고유 강점과 흔한 오해를 짚는다.
Virtual Thread의 Mount/Unmount 동작 원리, 코루틴 Continuation과의 차이, AOP 프록시가 문제없는 이유, 그리고 synchronized pinning 함정과 실무 대응까지.
Spring이 suspend fun을 mono {}로 감싸 Reactor 파이프라인에 태우는 방식과, AOP 프록시가 COROUTINE_SUSPENDED를 메서드 종료로 오인하는 구조적 한계 — @Transactional + 코루틴이 안 되는 이유까지.
Kotlin Coroutines로 Reactor의 깊은 flatMap 체이닝을 순차적 동기 코드처럼 작성하기. suspend, CPS 변환, 상태 머신, Flow, Channel, 구조화된 동시성까지.
Spring MVC의 1요청-1스레드 한계에서 출발해 Netty 이벤트 루프 구조, MVC vs WebFlux 요청 처리 비교, 이벤트 루프에서 하면 안 되는 것까지 — WebFlux의 동작 원리를 파헤친다.
Pull vs Push 모델부터 Reactive Streams 4개 인터페이스, Reactor의 Mono/Flux와 핵심 연산자, backpressure까지 — 리액티브 프로그래밍의 뼈대를 잡는다.
Thread와 Runnable에서 Callable/Future, ExecutorService, CompletableFuture까지 — Java 동시성 API가 "스레드를 직접 관리하지 마라"는 방향으로 발전해온 과정을 따라간다.
Process와 Thread의 차이, 동시성 vs 병렬성, 그리고 동기/비동기·블로킹/논블로킹이 서로 독립적인 두 축이라는 것까지 — JVM 동시성 시리즈의 기초 체력 편.
Micrometer 방식(Library)과 OTel Java Agent 방식(바이트코드 조작)의 동작 원리를 비교. premain과 Instrumentation API, ByteBuddy 코드 주입까지 내부를 들여다본다.
suspend 지점마다 스레드가 바뀌는 코루틴에서 컨텍스트를 전파하는 법 — CoroutineContext 구조, ThreadContextElement, asContextElement()로 ThreadLocal을 잇는 방법까지.