본문 바로가기
Backend2026년 6월 28일4분 읽기

동기·비동기, 블로킹·논블로킹 한 번에 정리

YS
김영삼
조회 150
동기·비동기, 블로킹·논블로킹 한 번에 정리

핵심 요약

동기/비동기와 블로킹/논블로킹은 서로 다른 두 축이다. ①동기/비동기는 "결과를 누가 언제 확인하느냐"(호출자가 직접 기다림 vs 콜백·이벤트로 통지), ②블로킹/논블로킹은 "제어권을 돌려주느냐"(호출이 끝날 때까지 멈춤 vs 즉시 리턴)를 말한다. 두 축을 섞으면 네 조합이 나온다.

1. 두 축을 분리해서 보기

  • 동기 — 작업 결과를 호출한 쪽이 직접 확인하고 순서대로 진행
  • 비동기 — 결과 확인을 콜백·Promise·이벤트에 맡기고 넘어감
  • 블로킹 — 호출한 함수가 끝날 때까지 제어권을 안 돌려줌
  • 논블로킹 — 아직 안 끝나도 일단 제어권을 즉시 돌려줌

2. 네 가지 조합

블로킹논블로킹
동기일반 함수 호출(파일 읽기 대기)결과를 반복해서 물어봄(폴링)
비동기드묾(async인데 결과를 기다림)콜백·Promise·이벤트 루프

3. 코드로 보는 차이

// 동기 · 블로킹 — 끝날 때까지 다음 줄로 안 감
const data = fs.readFileSync('a.txt')
console.log(data)

// 비동기 · 논블로킹 — 즉시 다음 줄, 결과는 콜백으로
fs.readFile('a.txt', (err, data) => console.log(data))
console.log('먼저 찍힘')

4. 왜 중요한가

  • 서버가 요청마다 블로킹 I/O로 멈추면 동시 처리량이 폭락한다
  • Node.js·논블로킹 모델은 I/O 대기 중 다른 요청을 처리해 적은 스레드로 많은 연결을 감당
  • 단, CPU를 오래 쓰는 계산은 이벤트 루프를 막으니 워커/프로세스로 분리

5. 면접 답변 틀

"동기/비동기는 결과를 직접 기다리느냐 통지받느냐, 블로킹/논블로킹은 제어권을 바로 돌려주느냐의 차이입니다. 서버는 I/O 대기가 많아 비동기·논블로킹으로 처리량을 높이고, CPU 바운드 작업은 이벤트 루프를 막으니 별도 워커로 뺍니다."


자주 묻는 질문

비동기면 무조건 논블로킹 아닌가요?

보통 함께 가지만 개념은 다릅니다. 비동기는 결과 통지 방식, 논블로킹은 제어권 반환 여부입니다. async 함수 안에서 await로 결과를 기다리면 그 지점은 논리적으로 블로킹처럼 동작합니다(다만 이벤트 루프는 다른 일을 함).

await는 스레드를 막나요?

아니요. await는 현재 코루틴을 잠시 멈추고 제어권을 이벤트 루프에 돌려줘 다른 작업을 처리하게 합니다. 스레드 자체가 멈추는 블로킹과 다릅니다. 그래서 하나의 스레드로도 수많은 동시 I/O를 다룰 수 있습니다.

논블로킹인데 결과는 언제 받나요?

콜백·Promise·이벤트로 나중에 통지받거나, 폴링으로 "다 됐니?"를 반복해서 확인합니다. 이벤트 루프 기반 런타임은 완료된 작업의 콜백을 큐에 넣어 순서대로 실행합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록