오늘은 블로킹/논블로킹, 동기/비동기라는 개념들을 알고는 있었지만 설명하려고 하니 조금 헷갈리더라구요.
회사나 학교 프로젝트에서 개발을 하다보면 접하게 되는 용어들인 블로킹(Blocking)과 논블로킹(Non-blocking), 동기(Synchronous)와 비동기(Asynchronous)에 대해서 정리해보려고 합니다.
블로킹과 논블로킹의 차이점은 호출하는 쪽의 관점으로 생각하면 되는데 함수를 호출했을 때 멈춰서 기다릴지 말지를 보면 됩니다.
블로킹은 호출된 함수가 결과 받는 시간이 좀 걸린다면 작업이 완전히 끝날때까지 호출된 함수 쪽이 제어권을 가지고 호출한 함수쪽을 기다리게 하는것을 말합니다.
제어권: 프로그램에서 코드 실행 순서를 결정하고 관리하는 권한
논블로킹은 호출된 함수가 결과 받는 시간이 좀 걸린다면 호출된 함수가 호출한 함수에게 바로 제어권을 주어 결과를 기다리지 않고 다른 작업을 할 수 있도록 하는 것을 말합니다.
동기와 비동기의 차이점은 전체적인 실행 흐름의 관점으로 생각하면 되는데 작업들을 순서대로 처리할지 말지를 보면 됩니다.
동기는 요청한 작업들의 완료 여부를 확인하여 순서대로 하나씩 실행되는 방식이에요.
첫 번째 작업이 완전히 끝나야 두 번째 작업을 시작하는 구조인거죠.
예를 들면 이어달리기와 같다고 생각하시면 됩니다.
첫번째 주자가 두번째 주자에게 바톤을 넘겨주기까지 기다리는 것 처럼요
function work() {
console.log("작업2");
}
console.log("작업1");
work();
console.log("작업3");
/*
출력결과
작업1
작업2
작업3
*/
위와 같이 예시코드를 작성 후 실행하면 작업1 -> 작업2 -> 작업3 순으로 결과가 나오는 것을 확인할 수 있습니다.
이처럼 동기는 순차적으로 진행되기 때문에 순서가 보장되고 만일 현재 실행중인 함수의 작업시간이 길다면 종료되기 전까지 다음 작업을 할 수 없다는 특징도 있습니다.
비동기는 요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 바로 수행하는 방식이며 요청한 작업 결과는 나중에 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()함수를 호출한 후 바로 반환하고 실제 작업을 백그라운드에서 따로 처리되어 완료 멘트들을 반환 받는 것을 볼 수 있습니다.
모든 작업 동시 시작 -> 함수 즉시 종료 -> 세 번째 작업 완료-> 두 번째 작업 완료 -> 첫 번째 작업 완료

이처럼 앞에 시간이 좀 걸리는 작업이 있다면 기다리지 않고 병렬 작업을 진행할수 있는 특징이 있기 때문에 시스템 자원을 효율적으로 사용하며 응답 시간을 단축시킬 수 있겠죠.
블로킹(Blocking): 호출된 함수가 작업이 끝날때까지 제어권을 가지고 기다리게 하는것
논블로킹(Non-blocking) : 호출된 함수가 호출한 함수에게 제어권을 주어 기다리지 않고 다른 작업을 할 수 있도록 하는것
동기(Synchronous): 요청한 작업들의 완료 여부를 확인하여 순서대로 실행되는 방식
비동기(Asynchronous) : 요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 바로 수행하며 요청한 작업 결과는 나중에 callback/Promise 등으로 수신하는 방식
동기/비동기와 블로킹/논블로킹 각각의 개념에 대해 정리해봤습니다.
위 요소들을 어떻게 조합해서 사용하냐에 따라 프로그램의 성능과 효율성을 높일 수도 있다고 합니다.