자바스크립트의 비동기 프로그래밍은 콜백과 프로미스(Promise)를 사용하여 처리됩니다. 그러나 콜백은 복잡성을 증가시키고 가독성을 떨어뜨리기 때문에 코드를 유지 보수하거나 확장하기 어렵게 만들 수 있습니다.
자바스크립트의 async/await
는 비동기 코드를 동기식으로 작성할 수 있도록 도와주는 문법입니다. 이를 사용하면 코드를 보다 간단하고 명확하게 작성할 수 있으며, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.
1. async
함수 정의하기
async
함수는 비동기적으로 실행되는 함수를 정의하는 키워드입니다. 함수 본문에는 await
키워드가 포함되어야 합니다. 이 키워드는 비동기 코드의 실행을 일시 중지하고 프로미스가 처리되는 것을 기다립니다.
async function getData() {
// 비동기 작업 수행
const data = await fetch('https://api.example.com/data');
return data;
}
위의 예제에서 fetch
함수는 서버에서 데이터를 가져오는 비동기 작업을 수행합니다. await
키워드는 fetch
함수가 프로미스를 반환할 때까지 코드 실행을 일시 중지하고, 프로미스가 처리되면 해당 값을 반환합니다.
2. await
를 사용하여 비동기 작업 처리하기
await
키워드를 사용하여 비동기 작업을 처리할 수 있습니다. 이 키워드 다음에 오는 표현식은 프로미스나 프로미스를 반환하는 비동기 함수여야 합니다. await
키워드가 포함된 함수는 비동기 함수여야 하기 때문에, await
는 async
함수 안에서만 사용할 수 있습니다.
async function processData() {
try {
const data = await getData();
console.log(data);
} catch (error) {
console.error(error);
}
}
위의 예제에서 getData
함수의 비동기 작업을 처리하기 위해 await
키워드를 사용하였습니다. getData
함수가 프로미스를 반환할 때까지 코드 실행은 일시 중지되고, 프로미스가 처리되면 해당 값을 data
변수에 할당합니다.
3. 에러 처리하기
async/await
을 사용하여 비동기 코드를 처리할 때, 예외(에러) 처리도 중요한 부분입니다. 비동기 작업을 수행하는 함수를 try/catch
블록으로 감싸서 예외를 처리할 수 있습니다.
async function processData() {
try {
const data = await getData();
console.log(data);
} catch (error) {
console.error(error);
}
}
위의 예제에서 getData
함수에서 발생하는 예외를 try/catch
블록으로 처리하고 있습니다. 비동기 작업에서 발생한 예외는 catch
블록 안에서 처리되고, 이를 통해 에러를 적절히 다룰 수 있습니다.
4. 비동기 작업의 병렬 처리하기
async/await
를 사용하면 여러 개의 비동기 작업을 병렬로 처리할 수 있습니다. 이를 위해 Promise.all()
을 사용하면 됩니다. Promise.all()
은 여러 개의 프로미스를 동시에 실행하고, 모든 프로미스가 처리될 때까지 기다리고 그 결과를 배열로 반환합니다.
async function processMultipleData() {
try {
const promises = [getData1(), getData2(), getData3()];
const results = await Promise.all(promises);
console.log(results);
} catch (error) {
console.error(error);
}
}
위의 예제에서 getData1
, getData2
, getData3
함수가 각각 다른 비동기 작업을 수행하고 있습니다. 이들을 병렬로 실행하기 위해 Promise.all()
을 사용하였고, 결과는 results
배열에 담아 출력합니다.
결론
자바스크립트의 async/await
을 이용하면 비동기 코드를 동기식으로 작성할 수 있어 가독성이 좋아지고 유지 보수성이 향상됩니다. async/await
은 비동기 작업의 순차 처리와 병렬 처리를 간편하게 해주는 강력한 도구입니다. 비동기 코드를 작성할 때는 async/await
을 적절히 활용하여 클린하고 효율적인 코드를 만들 수 있습니다.