Blocking vs Non-Blocking, Synchronous vs Asynchronous 완전 정복

박병욱·2025년 4월 18일
0

TIL

목록 보기
3/11
post-thumbnail

프로그래밍에서 한 번쯤은 들어봤을 용어들, Blocking / Non-Blocking / Synchronous / Asynchronous.

처음엔 헷갈릴 수 있다. "동기? 비동기? 블로킹? 안 기다리는 건가?" 헷갈리기 쉬운 이 개념들, "제어권""시간" 이라는 두 키워드를 통해 확실하게 구분해보자.

 

🚦 Blocking vs Non-Blocking — 제어권 관점

✅ 핵심 개념

  • “제어권(Control)” 이 누구에게 있는가?
  • 함수를 실행할 "순서와 권리" 가 누구에게 있는지에 따라 구분된다.

 

<Blocking : 기다리는 방식>

함수 A는 함수 B를 호출한다. 그리고 함수 A는 함수 B가 끝날 때까지 아무 것도 하지 못하고 대기한다.

 

🧠 쉽게 생각하면:

친구한테 파일 보내 달라고 하고 가만히 기다리는 상황

"파일 다 보내주면 그때 알려줘. 나 그거 받고 다음 할 일 할게!"

 

📊 흐름도:

  • A가 B를 호출하면 제어권을 넘김
  • B가 끝나면 제어권을 A에게 다시 돌려줌
  • A는 그제야 나머지 작업 수행

 

🖼 예시 코드 (Java):

Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine(); // 입력이 들어오기 전까지 프로그램 멈춤
System.out.println("입력값: " + input);

 

<Non-Blocking : 안 기다리는 방식>

함수 A는 함수 B를 호출한다. 하지만, 함수 A는 함수 B가 끝나든 말든 자기 할 일을 계속한다.

 

🧠 쉽게 생각하면:

친구한테 파일 보내 달라고 하고, 다른 작업 먼저 시작하는 상황

"파일 다 되면 알아서 알려줘! 나 그동안 이메일 좀 보낼게"

 

📊 흐름도:

  • A가 B를 호출하고 바로 제어권을 다시 가짐
  • A는 계속 자기 일 진행
  • B는 따로 백그라운드에서 작업 후 결과를 넘겨줌

 

⏱ Sync vs Async — 시간 관점

✅ 핵심 개념

  • 함수의 종료 시점결과를 받는 시점이 일치하는가?
  • 함수가 끝날 때 결과도 바로 받아야 하는지, 나중에 받아도 괜찮은지에 따라 구분된다.

 

<Synchronous : 바로 결과가 필요한 방식>

함수가 끝나자마자 바로 결과를 받아야 하는 경우다. 함수 A는 함수 B가 끝날 때까지 기다리고, 결과를 바로 받아서 다음 일을 처리한다는 말이다.

 

🧠 쉽게 생각하면:

"친구가 전화를 끊어야 나도 다음 일 할 수 있어"

 

📊 특징:

  • 결과가 꼭 즉시 필요함
  • 다음 로직이 이전 결과에 의존적

 

🖼 예시 코드 :

int result = calculate(); // 이게 끝나야 다음 줄 실행 가능
System.out.println("결과는 " + result);

 

<Asynchronous : 결과는 나중에 와도 괜찮은 방식>

함수가 끝난 후, 결과를 나중에 받아도 상관없는 경우다. 함수 A는 함수 B를 호출하고, 함수 B가 언제 끝나든 상관없이 자신의 코드를 진행한다.

 

🧠 쉽게 생각하면:

"설문조사 보냈고, 언제 회신 올지 모르지만 나는 다른 업무 먼저 할게"

 

🖼 자바스크립트 예시:

fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data));
console.log("나는 먼저 실행돼요!");

 

🔄 4가지 조합 정리

조합설명실생활 비유
Blocking + Sync기다리고, 결과도 바로 받아야 함음식점에서 주문하고, 음식 나올 때까지 서서 기다리는 손님
Non-Blocking + Sync기다리진 않지만, 결과는 즉시 확인함주기적으로 전자레인지 들여다보며 음식 다 됐나 확인
Blocking + Async기다리긴 하지만, 결과를 즉시 처리하진 않음우체국 줄 서 있다가, 택배 부치고 결과는 다음날 문자로 받음
Non-Blocking + Async기다리지도 않고, 결과도 나중에 처리음식 배달 앱으로 주문하고 다른 일 하다 배달 오면 받기

 

💻 예시 코드 비교 (Java)

1. Blocking & Synchronous

Scanner scanner = new Scanner(System.in);
System.out.println("메시지를 입력해주세요:");
String message = scanner.nextLine(); // 사용자가 입력할 때까지 기다림
System.out.println("입력받은 메시지: " + message);

 

2. Non-Blocking & Synchronous (의미상 폴링처럼 동작)

while (!queue.hasData()) {
    // 다른 작업 수행
    Thread.sleep(100); // 수시로 확인
}
String data = queue.get();
System.out.println("데이터 도착: " + data)

 

3. Blocking & Asynchronous

Future<String> future = executor.submit(() -> {
    Thread.sleep(1000); // 비동기로 동작하지만
    return "완료!";
});

String result = future.get(); // 여전히 get에서 기다림 = 블로킹
System.out.println("결과: " + result);

 

4. Non-Blocking & Asynchronous (콜백 예시)

CompletableFuture.supplyAsync(() -> {
    return "결과 도착!";
}).thenAccept(result -> {
    System.out.println("받은 결과: " + result);
});
System.out.println("나는 기다리지 않아요.");

 

🎯 마무리 정리

개념기준핵심 키워드
Blocking / Non-Blocking제어권 기준함수의 실행 권한을 넘기고 기다리는가?
Synchronous / Asynchronous시간 기준결과를 즉시 받는가, 나중에 받는가?
  • 둘은 관점의 차이이며, 코드 흐름상 헷갈릴 수 있다.
  • 실무에서는 보통 Async + Non-Blocking 조합이 네트워크나 IO 작업에서 많이 사용된다.
profile
도메인을 이해하는 백엔드 개발자(feat. OOP)

0개의 댓글