2026-02-07

동기(Synchronous) / 비동기(Asynchronous)

기준 ⇒ “작업 결과를 언제, 어떻게 신경 쓰는가”

  • 동기
    • 작업 A가 끝나야 다음 작업 B를 수행
    • 호출한 쪽이 결과를 직접 기다림
    • 흐름이 순차적 ⇒ 동기는 작업의 완료 시점이 흐름 제어에 포함된다.
  • 비동기
    • 작업 A를 요청만 하고 다음 작업 B를 수행
    • 결과는 나중에 이벤트/콜백/Promise로 처리
    • 흐름이 분리됨 ⇒ 비동기는 작업의 완료 여부와 흐름 제어가 분리된다.
  • 예시 (JS 기준)

    // 동기
    const data = getData(); // 끝날 때까지 기다림
    console.log(data);
    
    // 비동기
    getData().then((data) => console.log(data));
    console.log("다음 작업");
    

블로킹(Blocking) / 논블로킹(Non-blocking)

기준 ⇒ “제어권을 누구에게 넘기느냐”

  • 블로킹
    • 호출된 함수가 끝날 때까지 제어권을 돌려주지 않음
    • 호출한 쪽은 아무것도 못 하고 멈춤 ⇒ 블로킹은 제어권이 반환되지 않아 실행이 멈추는 상태
  • 논블로킹
    • 작업을 요청하자마자 제어권을 즉시 반환
    • 호출한 쪽은 다른 일 수행 가능 ⇒ 논블로킹은 작업 완료 여부와 상관없이 제어권을 바로 돌려준다.

둘은 독립 개념

구분 기준
동기 / 비동기 결과 처리 방식
블로킹 / 논블로킹 제어권 반환 여부

⇒ 조합 가능

네 가지 조합 사용

① 동기 + 블로킹

  • 결과 기다림 O
  • 제어권 반환 X
  • 가장 단순, 가장 비효율적
  • 예) 일반적인 파일 읽기, 오래 걸리는 계산

② 동기 + 논블로킹

  • 결과는 계속 확인 (자원 낭비 발생)
  • 제어권은 즉시 반환
  • 예) 결과를 polling 하는 방식

③ 비동기 + 블로킹

  • 결과는 나중에 받음
  • 제어권을 안 돌려줌 → 거의 안 씀
  • 실무에서는 거의 사용되지 않는 구조

④ 비동기 + 논블로킹

  • 결과는 나중에 처리
  • 제어권 즉시 반환
  • JS, Node.js, 프론트의 핵심 구조
    • 자바스크립트는 비동기·논블로킹 I/O 모델 기반 동작
  • 예) Promise, async/await, 이벤트 루프 기반 I/O

프론트와 연결

  • 이벤트 루프
    • 논블로킹으로 요청
    • 완료 시 Task / Microtask Queue에 등록
    • Call Stack이 비면 실행
  • async / await
    • 비동기 + 논블로킹
    • 코드만 동기처럼 보이게 만든 문법
    • async/await가 동기인가요?

      아니요. 비동기 작업을 동기처럼 표현한 문법적 추상화입니다.

요약

  • 동기: 결과를 기다리며 흐름을 제어한다
  • 비동기: 결과 처리와 흐름을 분리한다
  • 블로킹: 제어권을 반환하지 않는다
  • 논블로킹: 제어권을 즉시 반환한다

참고자료

  • https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
  • https://trustmitt.tistory.com/85
  • https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0
  • https://coor.tistory.com/53

results matching ""

    No results matching ""