JVM 동시성 모델 이해하기 (8) – 총정리 — 언제 무엇을 선택할 것인가
JVM 동시성 8부작 시리즈의 마지막. Virtual Thread, Reactor, Coroutines 중 무엇을 선택할지 네 가지 질문으로 정리하고, 기술별 고유 강점과 흔한 오해를 짚는다.
개발하면서 배운 것들 · 25개의 글
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을 잇는 방법까지.
WebFlux 이벤트 루프에서 ThreadLocal 기반 traceId 전파가 실패하는 이유와, Reactor Context의 Bottom-Up 전파 모델로 이를 해결하는 방법을 실전 예제로 다룬다.
ThreadLocal의 내부 구조와 사용법, MDC가 로그에 traceId를 심는 원리, 그리고 Spring MVC에서 스레드가 바뀌는 순간 — 비동기로 가기 전에 알아야 할 기초.
Observability 세 기둥과 Distributed Tracing이 필요한 이유, Zipkin B3에서 OpenTracing/OpenCensus 분열을 거쳐 OpenTelemetry로 통합되기까지의 역사, 그리고 Spring 생태계의 현재.
AccessModes 세 가지의 실제 의미, Deployment + RWO PVC 조합의 함정, PV 라이프사이클과 Reclaim Policy까지 — PV/PVC 실전 운영에서 마주치는 문제들.
Kubernetes 볼륨 개념부터 emptyDir·hostPath 같은 Volume 타입, 그리고 PV/PVC로 Pod와 스토리지의 생명주기를 분리하는 구조까지 — 스토리지 시리즈 첫 편.
kubectl apply부터 컨테이너 실행까지 — API Server, Controller Manager, Scheduler, kubelet이 각자 어떤 역할로 Pod를 배치하고 실행하는지 단계별로 추적한다.
Pod IP는 누가 할당하고 Pod끼리는 어떻게 통신하는가 — CNI, veth pair, Linux Bridge, 노드 간 라우팅, CoreDNS 서비스 디스커버리까지 패킷 흐름으로 이해한다.
외부 HTTP 요청이 LB → Ingress Controller → Service → Pod까지 도달하는 전체 경로를 추적. kube-proxy와 iptables, conntrack, 그리고 구간별 트러블슈팅 명령어까지.
CPU·메모리·디스크·네트워크 지표를 CloudWatch 대시보드 한 화면에 모으고, 로그 수집과 알람까지 연결해 EC2 모니터링을 완성하는 과정.
EC2 기본 모니터링엔 없는 메모리·디스크 지표를 CloudWatch Agent로 수집하는 방법. IAM 역할 생성부터 Agent 설치·설정, t3.micro에서의 리소스 오버헤드까지 단계별로 다룬다.
EC2 모니터링 탭과 CloudWatch의 관계, 기본 vs 세부 모니터링의 차이와 비용, 무료 범위까지 — EC2 서버 상태 모니터링의 기초를 잡는 시리즈 첫 편.
Apple Silicon Mac에서 Spring Cloud Gateway만 DNS 해석에 실패하는 문제의 원인(Netty의 자체 DNS resolver)과 해결책. 네이티브 라이브러리 의존성과 Gradle Configuration 개념까지 함께 정리.
one-indexed-parameters를 켜면 @PageableDefault(page = 1)이 오히려 두 번째 페이지를 가리키는 함정 — Spring Data 소스 코드와 테스트로 원인을 검증하고 올바른 사용법을 정리한다.
디스크가 가득 찬 EC2에서 EBS 볼륨을 무중단으로 확장하는 방법. 디스크 상태 진단, docker system prune 응급 처치, 볼륨 확장 후 파티션·파일시스템 적용까지.
AWS EC2에 Docker Compose로 WordPress를 올리고 Cloudflare로 도메인·HTTPS까지 연결하는 전 과정. SSH 설정, Security Group, Elastic IP 등 처음 서버를 만드는 사람 기준으로 정리했다.