개발기록
WebFlux와 같은 리액티브 프로그래밍 모델이 이미 효과적으로 비동기 프로그래밍을 지원하고 있는데, 왜 코루틴이 필요한지 의문이 들 수 있습니다.이 글에서는 코루틴의 필요성과 리액티브 프로그래밍과의 차이점을 살펴보겠습니다.1. 리액티브 프로그래밍의 한계리액티브 프로그래밍(예: WebFlux)은 강력하지만, 몇 가지 한계가 있습니다:복잡성: 복잡한 비즈니스 로직을 구현할 때 코드가 복잡해질 수 있습니다.학습 곡선: 리액티브 스트림과 연산자에 대한 깊은 이해가 필요합니다.디버깅의 어려움: 비동기 스택 트레이스를 추적하기 어려울 수 있습니다.명령형 코드와의 통합: 기존의 명령형 코드와 통합하기 어려울 수 있습니다.2. 코루틴의 장점코루틴은 다음과 같은 장점을 제공합니다:간결성: 비동기 코드를 동기 코드처럼 ..
WebFlux에서 비동기 작업이 어떻게 처리되는지 정확히 이해하셨습니다. 이 프로세스를 단계별로 더 자세히 살펴보겠습니다.1. 이벤트 루프 스레드의 작업 흐름@GetMapping("/example")public Mono exampleEndpoint() { return Mono.just("Start") .map(s -> s + " processing") // 즉시 실행 .flatMap(s -> callExternalService(s)) // 비동기 작업 .map(s -> s + " done"); // 비동기 작업 완료 후 실행}이 메서드의 실행 흐름은 다음과 같습니다:스레드 할당:요청이 들어오면 이벤트 루프 스레드 풀에서 하나의 스레드가 이 작업을 담당합니다..
Spring WebFlux의 비동기, 논블로킹 모델은 I/O 집약적인 작업에 특히 효과적입니다.그러나 순수한 연산 작업만 있는 경우, 이 모델은 어떻게 동작할까요? 이번 포스트에서는 이 주제를 깊이 살펴보겠습니다.1. WebFlux의 스레드 모델 복습WebFlux는 기본적으로 두 가지 주요 스레드 그룹을 사용합니다:이벤트 루프 그룹 (또는 워커 그룹)역할: 모든 I/O 작업과 비동기 이벤트 처리구성: 여러 개의 이벤트 루프 스레드 (일반적으로 CPU 코어 수와 동일)Boss 그룹역할: 새로운 연결 수락구성: 일반적으로 1개의 스레드2. 순수 연산 작업의 경우순수한 연산 작업만 있는 경우에도, 이 작업은 이벤트 루프 그룹(워커 스레드)에서 처리됩니다.Boss 그룹이 이러한 작업을 직접 처리하지 않습니다. ..
Spring WebFlux는 비동기, 논블로킹 웹 애플리케이션을 구축하기 위한 강력한 프레임워크입니다.이 글에서는 WebFlux의 스레드 모델, 비동기 및 블로킹 작업 처리 방식, 그리고 스레드 풀의 역할에 대해 종합적으로 알아보겠습니다.1. WebFlux의 스레드 모델WebFlux는 Reactor Netty를 기반으로 하며, 다음과 같은 스레드 구조를 가집니다:1.1 Boss 스레드역할: 새로운 클라이언트 연결 수신 및 수락특징: 일반적으로 1개만 존재동작: 자체적인 이벤트 루프 실행1.2 Worker 스레드 (이벤트 루프 스레드)역할: 실제 클라이언트 요청 처리 및 I/O 작업 수행특징: CPU 코어 수만큼 생성 (예: 4코어 시스템에서 4개)동작: 각각 독립적인 이벤트 루프 실행2. 비동기 처리 v..
WebFlux의 스레드 모델을 이해하는 것은 때로 혼란스러울 수 있습니다.특히 워커 스레드와 Schedulers.boundedElastic()의 역할에 대해 의문이 생길 수 있습니다.이 포스트에서는 이 두 개념의 차이점과 각각의 사용 시나리오를 명확히 설명하겠습니다.1. 워커 스레드의 역할WebFlux의 워커 스레드(Netty의 이벤트 루프 스레드)는 주로 다음과 같은 작업을 수행합니다:비동기 I/O 작업 처리HTTP 요청/응답 처리비즈니스 로직 실행 (논블로킹인 경우)이 스레드들은 논블로킹 작업을 효율적으로 처리하도록 설계되어 있습니다.2. Schedulers.boundedElastic()의 필요성그렇다면 왜 Schedulers.boundedElastic()이 필요할까요? 이유는 다음과 같습니다:블로킹..
Spring WebFlux의 핵심 특징 중 하나는 비동기 논블로킹 I/O 처리입니다. 이 블로그 포스트에서는 WebFlux에서 I/O 작업과 이벤트 루프가 어떻게 상호작용하는지 자세히 살펴보겠습니다.1. 이벤트 루프란?이벤트 루프는 비동기 프로그래밍의 핵심 개념으로, 지속적으로 실행되면서 이벤트나 작업을 처리하는 프로그래밍 구조입니다. WebFlux에서 이벤트 루프는 들어오는 요청을 처리하고, I/O 작업을 관리하며, 완료된 작업의 콜백을 실행하는 역할을 합니다.2. I/O 작업과 이벤트 루프의 상호작용 과정I/O 작업과 이벤트 루프의 상호작용은 다음과 같은 단계로 이루어집니다:2.1. I/O 작업 시작이벤트 루프가 I/O 작업(예: 데이터베이스 쿼리, 외부 API 호출)을 만나면, 해당 작업을 시작합니..
Amazon Simple Queue Service(SQS)는 AWS의 핵심 서비스 중 하나로, 분산 시스템과 마이크로서비스 아키텍처에서 중요한 역할을 합니다. 이 글에서는 SQS의 작동 원리를 고급 개발자의 관점에서 자세히 살펴보겠습니다.1. 분산 시스템 아키텍처SQS는 완전 관리형 분산 메시지 대기열 서비스입니다. 여러 가용 영역(AZ)에 걸쳐 높은 가용성과 내구성을 제공하며, 각 메시지는 여러 서버에 복제되어 저장됩니다.2. 메시지 생명주기전송: 생산자가 SendMessage API를 사용하여 메시지를 대기열에 전송저장: 메시지가 여러 AZ의 SQS 서버에 중복 저장수신: 소비자가 ReceiveMessage API를 사용하여 메시지를 폴링처리: 소비자가 메시지를 처리삭제: 소비자가 DeleteMess..
개요Garbage Collection(GC)은 자바, 코틀린 등의 언어에서 중요한 메모리 관리 메커니즘입니다. 하지만 GC가 자주 발생하면 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 따라서 Heap 메모리에서 불필요한 객체 생성을 최소화하는 것이 중요합니다.GC 최적화를 위한 6가지 전략객체 재사용새로운 객체를 생성하는 대신 기존 객체를 재사용합니다.예: 객체 풀(Object Pool) 패턴 활용불변 객체 사용불변 객체는 상태 변경이 불가능하여 새로운 객체 생성이 줄어듭니다.예: String, Integer 등의 불변 클래스 활용적절한 자료구조 선택상황에 맞는 효율적인 자료구조를 사용합니다.예: ArrayList vs LinkedList, HashMap vs TreeMap 등지역 변수 활용메..
컨텍스트 스위칭은 운영체제가 현재 실행 중인 프로세스나 스레드를 중단하고 다른 프로세스나 스레드를 실행하기 시작하는 과정입니다. 이 과정은 멀티태스킹 시스템에서 필수적이지만, 상당한 비용이 발생할 수 있습니다.1. 컨텍스트 스위칭의 일반적인 비용CPU 시간 소비: 컨텍스트 저장 및 복원에 CPU 사이클이 사용됩니다.캐시 미스: 새로운 프로세스/스레드의 데이터로 캐시를 다시 채워야 합니다.TLB (Translation Lookaside Buffer) 플러시: 주소 변환 정보를 업데이트해야 합니다.파이프라인 플러시: CPU 파이프라인이 중단되고 다시 채워져야 합니다.2. 프로세스 간 컨텍스트 스위칭비용이 높은 이유:메모리 관리 단위(MMU) 갱신: 각 프로세스는 독립적인 가상 주소 공간을 가집니다.커널 상태..