본문 바로가기

학습/WebFlux

블로킹(Blocking) vs 논블로킹(Non-Blocking) IO

📚 이전학습


블로킹(Blocking) vs 논블로킹(Non-Blocking) IO 🔄

IO(Input/Output)는 시스템의 데이터를 입력받거나 출력하는 모든 작업을 뜻합니다. 블로킹과 논블로킹은 이러한 IO 작업이 처리되는 방식에 따라 나뉩니다.


1. 블로킹 IO란? 🛑

블로킹 IO는 요청한 작업이 완료될 때까지 대기하는 방식입니다.
이 동안 다른 작업은 진행되지 않으며, 해당 스레드(Thread)는 요청된 작업이 끝날 때까지 블록(Block) 상태에 머무릅니다.

// 예시
// RestTemplate 객체 생성
RestTemplate restTemplate = new RestTemplate();

// 블로킹 방식으로 API 요청 (HTTP GET 요청)
// 요청이 완료될 때까지 현재 스레드는 대기합니다.
String url = "https://jsonplaceholder.typicode.com/posts/1";
String response = restTemplate.getForObject(url, String.class);

// 요청이 완료된 후 응답 데이터 출력
System.out.println("Response: " + response);

// 프로그램은 응답을 받은 후에야 다음 코드로 진행합니다.
System.out.println("Request completed!");

🔍 특징

  • 직관적 설계: 이해하기 쉽고 구현이 간단.
  • 리소스 비효율성: 대기 시간이 길어질 경우 비효율적.
  • 한 스레드가 IO 작업에 묶이면 다른 작업을 수행할 수 없음.

2. 논블로킹 IO란? 🚀

논블로킹 IO는 작업이 즉시 실행되지 않더라도 다른 작업을 계속 진행할 수 있는 방식입니다.
스레드는 IO 요청을 보내고, 데이터가 준비될 때까지 기다리지 않고 다른 작업을 수행합니다.

// WebClient 객체 생성 (논블로킹 클라이언트)
WebClient webClient = WebClient.create();

// 논블로킹 방식으로 API 요청 (HTTP GET 요청)
// 요청은 즉시 반환되고, 응답은 비동기적으로 처리됩니다.
String url = "https://jsonplaceholder.typicode.com/posts/1";
Mono<String> responseMono = webClient.get()
                                     .uri(url)
                                     .retrieve()
                                     .bodyToMono(String.class);

// 다른 작업 수행 가능
System.out.println("Request sent! Doing other tasks...");

// 응답 데이터를 구독하고 처리 (비동기적으로 실행)
responseMono.subscribe(response -> {
    System.out.println("Response: " + response);
});

// 메인 스레드가 즉시 종료되지 않도록 대기
try {
    Thread.sleep(2000); // 실제 애플리케이션에서는 적합한 종료 전략을 사용해야 함
} catch (InterruptedException e) {
    e.printStackTrace();
}

🔍 특징

  • 효율적 리소스 사용: 스레드가 작업을 차단하지 않음.
  • 복잡한 설계: 상태 관리와 콜백 처리 등으로 구현이 복잡할 수 있음.
  • 이벤트 기반으로 동작하며, 결과를 받을 때까지 상태를 추적.

3. 주요 차이점 비교 🔄

특성 블로킹 IO 🛑 논블로킹 IO 🚀
작업 방식 요청 완료 시까지 대기 요청 즉시 반환, 대기 없음
스레드 상태 블록(대기) 상태 자유롭게 다른 작업 가능
구현 난이도 간단 복잡 (상태 관리, 콜백 필요)
효율성 리소스 비효율적 리소스 효율적
적용 사례 단순한 소규모 애플리케이션 대규모 동시성 처리 애플리케이션

4. 블로킹/논블로킹 IO의 선택 기준 🤔

  • 블로킹 IO: 간단하고 직관적인 설계를 원하는 소규모 프로젝트.
  • 논블로킹 IO: 높은 동시성과 성능을 요구하는 대규모 애플리케이션.

예를 들어, Spring WebFlux는 논블로킹 IO 기반으로 작동하여 높은 효율성과 동시성 처리를 지원합니다.


📚 참고 자료

🔗 GitHub Repository

자세한 학습 자료는 아래 GitHub 저장소를 참조하세요:
https://github.com/ses9892/learn_recator_programing/tree/main

'학습 > WebFlux' 카테고리의 다른 글

Recactor 용어정의  (1) 2024.11.26
Reactor 란?  (0) 2024.11.26
Spring WebFlux란?  (0) 2024.11.26
리액티브 시스템과 리액티브 프로그래밍의 의미  (0) 2024.11.26
Spring WebFlux 학습정리  (0) 2024.11.26