비동기는 작업이 순차적으로 실행되지 않고, 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행하는 방식이다. \
이를 통해 다른 작업을 동시에 처리하거나, 시간이 오래 걸리는 작업을 효율적으로 다룰 수 있다.\
JavaScript에서는 콜백 함수, 프로미스, async/await 등을 사용하여 비동기 작업을 처리할 수 있다.
JavaScript는 Single Thread 언어로, 한 번에 하나의 작업만 수행할 수 있다.
Thread란 작업을 처리하는 주체를 의미하며, JavaScript는 Single Thread이므로 비동기 처리를 위해 Runtime 환경이 필요하다.
즉, 브라우저 환경에서는 Web API에서 처리된 작업이 Task Queue를 거쳐 Event Loop에 의해 Call Stack에 들어와 순차적으로 실행되어 비동기 작업이 가능한 환경이 된다.
Call Stack은 JavaScript에서 함수의 호출을 추적하는 자료구조로, 현재 실행 중인 함수의 정보를 저장하는 스택이다. 함수가 호출되면 해당 함수의 정보(함수 호출문, 매개변수 등)가 Call Stack에 쌓이고, 함수가 실행되면 Call Stack에서 제거된다. 이러한 방식으로 JavaScript는 함수 호출을 순차적으로 처리한다.
Promise는 JavaScript에서 비동기 처리를 위한 객체이다. Promise는 비동기 작업의 성공 또는 실패를 나타내는 상태와 함께 작업의 결과를 반환 한다. Promise는 세 가지 상태를 가질 수 있다: 대기(pending), 이행(fulfilled), 거부(rejected). 이행 또는 거부되면 해당 Promise의 상태는 변경되지 않는다.
async/await는 Promise를 기반으로 한 비동기 코드를 더 간결하고 동기적으로 작성할 수 있는 JavaScript의 문법적인 기능이다. async 함수 내에서 await 키워드를 사용하면 Promise가 이행될 때까지 기다리고, Promise가 이행되면 해당 결과를 반환한다. async/await를 사용하면 비동기 코드를 동기적으로 작성하는 것처럼 보이게 된다.
다음은 Promise와 async/await의 사용 예시 코드이다:
Promise 사용 예시:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = "데이터";
resolve(data); // Promise를 이행하고 데이터 반환
}, 2000);
});
}
fetchData()
.then((data) => {
console.log(data); // 비동기 작업 완료 후 데이터 출력
})
.catch((error) => {
console.error(error); // 에러 처리
});
async/await 사용 예시:
javascript;
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = "데이터";
resolve(data); // Promise를 이행하고 데이터 반환
}, 2000);
});
}
async function fetchDataAsync() {
try {
const data = await fetchData(); // 비동기 작업 완료까지 기다림
console.log(data); // 데이터 출력
} catch (error) {
console.error(error); // 에러 처리
}
}
fetchDataAsync();
위 코드에서 fetchData 함수는 비동기 작업을 수행하고 Promise를 반환한다. Promise를 사용하는 경우 then 메서드를 사용하여 비동기 작업의 성공 케이스를 처리하고, catch 메서드를 사용하여 실패 케이스를 처리한다.
fetchDataAsync 함수는 async 키워드로 정의된 비동기 함수이다. await 키드를 사용하여 fetchData 함수의 비동기 작업이 완료될 때까지 기다린 후, 결과를 변수에 할당한다. 그리고 결과를 출력하거나 에러를 처리한다.