본문 바로가기
Programming/기술 면접

[개발자 기술 면접 대비]🚦동기/비동기 vs 블로킹/논블로킹 – 헷갈리는 개념 한 번에 정리하기

by Mandy's 2025. 7. 25.

기술 면접 단골 질문: “동기와 블로킹이 같나요?”
이 질문에 제대로 답하기 위해선 개념을 구분하고, 조합해서 설명하는 능력이 필요합니다.


📌 개념 정리

✅ 동기(Synchronous)

  • 작업 완료 여부를 확인한 뒤 다음 작업을 수행
  • 즉, 순차적 흐름을 강제
  • 예: 함수 호출 → 결과 반환 → 다음 줄 실행

✅ 비동기(Asynchronous)

  • 작업 완료 여부를 기다리지 않고, 다음 작업을 수행
  • 결과는 콜백/이벤트/프로미스/await 등을 통해 나중에 처리
  • 병렬적 작업 흐름에 적합

✅ 블로킹(Blocking)

  • 함수 호출 시 작업이 끝날 때까지 기다림 (제어권 반환 X)
  • 작업 중인 동안 프로그램 흐름이 멈춤

✅ 논블로킹(Non-blocking)

  • 함수가 즉시 리턴됨 (작업이 끝나지 않아도)
  • 결과는 나중에 확인하거나, 실패 예외를 통해 처리

🔁 네 가지 조합 설명

조합 설명 예시

동기 + 블로킹 요청 후 작업이 끝날 때까지 기다리고, 순차적으로 실행 일반 함수 호출, 파일 읽기
비동기 + 논블로킹 요청 후 기다리지 않고 다음 작업 수행, 결과는 콜백 등으로 setTimeout(), Node.js, asyncio
동기 + 논블로킹 작업 완료를 기다리지는 않지만, 직접 체크하면서 순차 실행 while로 반복 체크, 폴링 방식
비동기 + 블로킹 결과는 나중에 처리하지만, 현재 작업은 멈추는 경우 (매우 드묾) 실무에서 거의 안 씀

📎 예시로 보는 개념 조합

🔸 비동기 + 논블로킹

  • setTimeout(), fetch(), await
  • 웹 브라우저는 파일 다운로드 중에도 다른 탭을 열 수 있다
  • 결과는 콜백이나 Promise로 처리됨

🔸 동기 + 블로킹

  • socket.recv() (블로킹 모드), read() 함수
  • 요청 결과가 올 때까지 아무 일도 하지 않음

🔸 동기 + 논블로킹

  • 논블로킹으로 요청하고, 주기적으로 상태를 확인 (폴링)
// Java에서 백그라운드 스레드를 돌리고, 메인에서 계속 체크
while (!thread.isDone()) {
    System.out.println("아직 완료되지 않음");
}
// 완료되면 다음 작업 수행

🔸 비동기 + 블로킹

  • 이론적으로 존재하나 실무에서는 거의 사용되지 않음
  • Async인데 내부 작업은 Blocking (이상적인 구조 아님)

⚠️ 오해 방지 포인트

  • 동기 ≠ 블로킹, 비동기 ≠ 논블로킹
    → 각각은 독립적인 개념입니다.
  • async/await는 코드 구조상 동기처럼 보이게 만들지만,
    내부적으로는 비동기 + 논블로킹 방식으로 작동합니다.

🎯 면접에서 이렇게 말해보세요

“동기/비동기는 작업 흐름의 순차 여부를 말하고, 블로킹/논블로킹은 함수 호출이 현재 흐름을 멈추는지 여부입니다. 예를 들어 setTimeout()은 비동기이자 논블로킹 함수이며, 일반적인 파일 입출력은 동기 + 블로킹 방식입니다.”