📚 이전학습
블로킹(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 |