JAVASCRIPT · 심층 가이드
JavaScript 비동기/동시성 완전 정리
순차와 병렬을 나누는 기준부터 타임아웃, 재시도, 취소 신호, debounce와 throttle까지 비동기 코드에서 반복되는 15가지 형태를 정리했습니다.
JavaScript의 동시성은 스레드가 아니라 이벤트 루프 위에서 돌아갑니다. 그래서 "동시에 실행"이라는 말은 CPU가 나뉘는 것이 아니라 대기 시간이 겹친다는 뜻입니다. 이 차이를 모르면 for 루프 안에서 await을 걸어 놓고 왜 느린지 의아해하거나, 반대로 CPU를 쓰는 계산을 async로 감싸 놓고 응답성이 개선되기를 기대하게 됩니다. 비동기는 대기를 겹치는 도구지 계산을 나누는 도구가 아닙니다.
순차 작업 처리와 병렬 작업 처리를 나란히 읽는 것부터 시작하시기 바랍니다. 앞 결과가 뒤 요청의 입력이면 순차, 서로 독립이면 Promise.all입니다. 여기에 timeout 처리와 retry 로직을 얹으면 실제 네트워크 코드의 골격이 완성되고, 취소 신호는 그 둘을 AbortController로 묶어 줍니다. 배치 처리는 병렬을 무제한으로 풀지 않기 위한 제어 장치로 읽으면 됩니다.
Promise.all은 하나가 실패하면 즉시 거부되지만, 나머지 작업은 취소되지 않고 계속 돕니다. 여기서 처리되지 않은 거부가 뒤늦게 터지면 Node에서는 기본적으로 프로세스가 종료됩니다. 전부의 결과가 필요하면 Promise.allSettled를 쓰고, 부분 실패를 허용하려면 각 작업을 개별적으로 감싸야 합니다. debounce와 throttle에서는 남아 있는 타이머를 정리하지 않아 컴포넌트가 사라진 뒤 콜백이 실행되는 사고가 잦습니다.
01비동기 함수 시작
JavaScript에서 비동기 함수 시작 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 비동기 함수 시작
async function run() {
const value = await Promise.resolve(1);
console.log(value);
}
run();비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
02순차 작업 처리
JavaScript에서 순차 작업 처리 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 순차 작업 처리
Promise.all([Promise.resolve("a"), Promise.resolve("b")]).then(console.log);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
03병렬 작업 처리
JavaScript에서 병렬 작업 처리 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 병렬 작업 처리
const controller = new AbortController();
controller.abort();
console.log(controller.signal.aborted);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
04timeout 처리
JavaScript에서 timeout 처리 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// timeout 처리
setTimeout(() => console.log("tick-4"), 10);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
05retry 로직
JavaScript에서 retry 로직 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// retry 로직
async function run() {
const value = await Promise.resolve(5);
console.log(value);
}
run();비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
06스트림 또는 채널 소비
JavaScript에서 스트림 또는 채널 소비 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 스트림 또는 채널 소비
Promise.all([Promise.resolve("a"), Promise.resolve("b")]).then(console.log);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
07producer consumer
JavaScript에서 producer consumer 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// producer consumer
const controller = new AbortController();
controller.abort();
console.log(controller.signal.aborted);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
08취소 신호
JavaScript에서 취소 신호 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 취소 신호
setTimeout(() => console.log("tick-8"), 10);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
09비동기 에러 처리
JavaScript에서 비동기 에러 처리 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 비동기 에러 처리
async function run() {
const value = await Promise.resolve(9);
console.log(value);
}
run();비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
10배치 처리
JavaScript에서 배치 처리 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 배치 처리
Promise.all([Promise.resolve("a"), Promise.resolve("b")]).then(console.log);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
11debounce
JavaScript에서 debounce 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// debounce
const controller = new AbortController();
controller.abort();
console.log(controller.signal.aborted);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
12throttle
JavaScript에서 throttle 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// throttle
setTimeout(() => console.log("tick-12"), 10);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
13파일 읽기 작업
JavaScript에서 파일 읽기 작업 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 파일 읽기 작업
async function run() {
const value = await Promise.resolve(13);
console.log(value);
}
run();비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
14요청 작업 감싸기
JavaScript에서 요청 작업 감싸기 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 요청 작업 감싸기
Promise.all([Promise.resolve("a"), Promise.resolve("b")]).then(console.log);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
15스케줄 작업
JavaScript에서 스케줄 작업 개념을 코드로 빠르게 확인하는 비동기/동시성 예제입니다.
JavaScript code
// 스케줄 작업
const controller = new AbortController();
controller.abort();
console.log(controller.signal.aborted);비동기 예제는 순차 실행과 병렬 실행이 실제로 어떻게 다른지 같이 관찰해 보세요.
비동기처럼 보이는 코드도 실제로는 순차 실행일 수 있으니 흐름을 꼭 확인해야 합니다.
정리하며
- 독립 작업만 Promise.all로 묶고 의존 관계가 있으면 순차로 둡니다
- Promise.all의 실패는 다른 작업을 멈추지 않으므로 allSettled를 고려합니다
- 타임아웃과 재시도는 AbortController로 취소까지 함께 설계합니다
- debounce·throttle은 정리 함수로 남은 타이머를 반드시 해제합니다
더 깊이 들어가고 싶다면 JavaScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.