CS 정리

논동기와 비블로킹

문쿼리 2025. 9. 5. 22:01

익숙해서 당연하게 쓰는것도 돌아보면 뭔가 아이디어를 얻을 수 있지 않을까요?

동기(Synchronous) & 비동기(Asynchronous)

 

블로킹(Blocking) & 논블로킹(Non-Blocking)

 

조합

조합 의미 특징/활용
블로킹-동기 제어권 안 줌 + 결과 올 때까지 기다림 가장 직관적. 파일 읽기, JDBC 쿼리, HTTP
논블로킹-동기 제어권은 바로 줌 + 하지만 결과 확인을 직접 계속 해야 함(polling) CPU 낭비가 있을 수 있음. NIO 소켓, IoT polling
블로킹-비동기 제어권 안 줌 + 결과는 나중에 콜백/알림으로 옴 GUI 이벤트 루프, Future.get
논블로킹-비동기 제어권 즉시 반환 + 결과는 알림/콜백/Promise로 받음 현대 시스템에서 가장 많이 쓰는 패턴, Node.js, WebFlux, Kafka

 

먼저보는 결론

실무에서는 논블로킹 또는 비동기를 활용할 때, 가능한 논블로킹-비동기 조합을 활용하는게 유리함
대부분 2번째(논블로킹-동기)·3번째(블로킹-비동기)를 굳이 쓸 필요가 없음

논블로킹-동기

호출은 즉시 반환되지만, 결과를 얻으려면 내가 계속 확인(polling)해야 함

 

블로킹-비동기

작업은 비동기로 실행되지만, 호출자가 get() 같은 메서드로 기다리는 순간 결국 블로킹됨.

 

논블로킹-비동기

요청 즉시 반환 + 결과는 콜백/Promise/이벤트 처리

 

 

추가 활용

서버 아키텍처

  • 논블로킹-비동기: 이벤트 루프 기반 서버 (예: Node.js, Netty, Spring WebFlux). 동시성 처리에 강함. I/O가 많은 환경(채팅, 게임 서버, API Gateway 등)에 적합.
  • 혼합 전략: DB 접근은 블로킹-동기, 네트워크 I/O는 논블로킹-비동기로 운영해 안정성과 성능을 동시에 확보.

네트워크 통신

  • REST API: 주로 블로킹-동기 구조. 직관적이지만 대기 시간이 길어질 수 있음.
  • WebSocket + 논블로킹-비동기: 실시간 알림/채팅/IoT 센서 데이터 수집 등에 활용.
  • gRPC: 동기/비동기 방식 모두 지원. 대규모 마이크로서비스 간 통신에 맞춤.

UI/UX

  • 블로킹-동기: 버튼 클릭 시 앱이 멈춰 있는 듯한 경험 → 사용자 경험 악화.
  • 논블로킹-비동기: 버튼 클릭 시 스피너(로딩 UI) 띄우고, 응답이 오면 화면 업데이트. 대부분의 모바일/웹 앱에서 이 패턴 사용.

데이터 처리

  • 배치 작업: 블로킹-동기 방식이 적합. (순차적, 보장된 실행 필요)
  • 스트리밍 처리 (Kafka, Spark Streaming): 논블로킹-비동기. 데이터가 계속 들어오므로 이벤트 기반으로 처리.

 

정리

  • 작고 단순한 프로그램: 블로킹-동기
  • 고성능/대규모 서버: 논블로킹-비동기
  • 특수 상황(거의 없다): 블로킹-비동기나 논블로킹-동기

'CS 정리' 카테고리의 다른 글

큐잉(Queuing)과 라우팅(Routing)  (0) 2025.09.22
동기(Synchronous) & 비동기(Asynchronous)  (0) 2025.09.03
블로킹(Blocking) & 논블로킹(Non-Blocking)  (0) 2025.09.02
Feign 사용해보기  (1) 2025.08.11
Java + Kotlin 혼용 개발  (0) 2025.07.31