[개발지식]블로킹/논블로킹, 동기/비동기 정리

권경환·2025년 9월 1일

CS지식/개발지식

목록 보기
2/5

오늘은 블로킹/논블로킹, 동기/비동기라는 개념들을 알고는 있었지만 설명하려고 하니 조금 헷갈리더라구요.
회사나 학교 프로젝트에서 개발을 하다보면 접하게 되는 용어들인 블로킹(Blocking)논블로킹(Non-blocking), 동기(Synchronous)비동기(Asynchronous)에 대해서 정리해보려고 합니다.

1. 블로킹(Blocking)과 논블로킹(Non-blocking)

블로킹과 논블로킹의 차이점은 호출하는 쪽의 관점으로 생각하면 되는데 함수를 호출했을 때 멈춰서 기다릴지 말지를 보면 됩니다.

블로킹(Blocking)이란?

블로킹은 호출된 함수가 결과 받는 시간이 좀 걸린다면 작업이 완전히 끝날때까지 호출된 함수 쪽이 제어권을 가지고 호출한 함수쪽을 기다리게 하는것을 말합니다.

제어권: 프로그램에서 코드 실행 순서를 결정하고 관리하는 권한

논블로킹(Non-blocking)이란?

논블로킹은 호출된 함수가 결과 받는 시간이 좀 걸린다면 호출된 함수가 호출한 함수에게 바로 제어권을 주어 결과를 기다리지 않고 다른 작업을 할 수 있도록 하는 것을 말합니다.

2. 동기(Synchronous)와 비동기(Asynchronous)

동기와 비동기의 차이점은 전체적인 실행 흐름의 관점으로 생각하면 되는데 작업들을 순서대로 처리할지 말지를 보면 됩니다.

동기(Synchronous)란?

동기는 요청한 작업들의 완료 여부를 확인하여 순서대로 하나씩 실행되는 방식이에요.
첫 번째 작업이 완전히 끝나야 두 번째 작업을 시작하는 구조인거죠.
예를 들면 이어달리기와 같다고 생각하시면 됩니다.
첫번째 주자가 두번째 주자에게 바톤을 넘겨주기까지 기다리는 것 처럼요

예시코드

function work() {
    console.log("작업2");
    
}
console.log("작업1");
work();
console.log("작업3");
/*
출력결과
작업1
작업2
작업3
*/

위와 같이 예시코드를 작성 후 실행하면 작업1 -> 작업2 -> 작업3 순으로 결과가 나오는 것을 확인할 수 있습니다.
이처럼 동기는 순차적으로 진행되기 때문에 순서가 보장되고 만일 현재 실행중인 함수의 작업시간이 길다면 종료되기 전까지 다음 작업을 할 수 없다는 특징도 있습니다.

비동기(Asynchronous)란?

비동기는 요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 바로 수행하는 방식이며 요청한 작업 결과는 나중에 callback/Promise 등으로 수신합니다.

예시코드

function asynchronousExample() {
    console.log("=== 비동기 처리 예시 ===");
    console.log("1. 모든 작업 동시 시작");
    
    // 모든 setTimeout이 동시에 등록됨
    setTimeout(() => {
        console.log("2. 첫 번째 작업 완료 (3초 후)");
    }, 3000);
    
    setTimeout(() => {
        console.log("3. 두 번째 작업 완료 (2초 후)");
    }, 2000);
    
    setTimeout(() => {
        console.log("4. 세 번째 작업 완료 (1초 후)");
    }, 1000);
    
    console.log("5. 함수 즉시 종료 (작업들은 백그라운드에서 계속)");
}

const startTime = Date.now();
asynchronousExample();
console.log(`함수 실행 시간: ${Date.now() - startTime}ms`);

위와 같이 첫 번째 작업은 3초, 두 번째작업은 2초, 세 번째 작업은 1초를 주고 실행했을때 asynchronousExample()함수를 호출한 후 바로 반환하고 실제 작업을 백그라운드에서 따로 처리되어 완료 멘트들을 반환 받는 것을 볼 수 있습니다.
모든 작업 동시 시작 -> 함수 즉시 종료 -> 세 번째 작업 완료-> 두 번째 작업 완료 -> 첫 번째 작업 완료

이처럼 앞에 시간이 좀 걸리는 작업이 있다면 기다리지 않고 병렬 작업을 진행할수 있는 특징이 있기 때문에 시스템 자원을 효율적으로 사용하며 응답 시간을 단축시킬 수 있겠죠.

3. 동기/비동기, 블로킹/논블로킹 요약

블로킹(Blocking): 호출된 함수가 작업이 끝날때까지 제어권을 가지고 기다리게 하는것
논블로킹(Non-blocking) : 호출된 함수호출한 함수에게 제어권을 주어 기다리지 않고 다른 작업을 할 수 있도록 하는것
동기(Synchronous): 요청한 작업들의 완료 여부를 확인하여 순서대로 실행되는 방식
비동기(Asynchronous) : 요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 바로 수행하며 요청한 작업 결과는 나중에 callback/Promise 등으로 수신하는 방식

동기/비동기블로킹/논블로킹 각각의 개념에 대해 정리해봤습니다.
위 요소들을 어떻게 조합해서 사용하냐에 따라 프로그램의 성능과 효율성을 높일 수도 있다고 합니다.

profile
성장을 좋아하는 주니어 개발자의 블로그

0개의 댓글