자바스크립트 비동기 이해하기 - (4.2) Async & Await 좀 더 알아보기
2025.04.18 - [FE develop/Javascript] - 자바스크립트 비동기 이해하기 - (4.1) Async & Await 알아보기
자바스크립트 비동기 이해하기 - (4.1) Async & Await 알아보기
이번 글에서는 Promise를 좀 더 간단하고 읽기 쉽게 작성할 수 있도록 도와주는 Async & Await 문법에 대해 알아보겠습니다. ✅ Async란?async 키워드는 비동기 함수를 선언할 때 사용하는 키워드입니다.
hjh0806.tistory.com
앞선 글에서는 async와 await의 기본적인 개념을 소개해드렸습니다. 이번 글에서는 이 문법을 조금 더 실용적인 예제들과 함께 알아보고, 에러 처리 방식과 Fetch API와의 활용 예도 함께 다뤄보겠습니다.
✅ async/await의 순차 실행
async 함수 안에서는 await을 사용하여 비동기 작업을 동기적인 코드처럼 작성할 수 있습니다. 예제를 보시죠
function networkRequest() {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 2000);
});
}
async function getUser() {
await networkRequest();
return "홍길동";
}
async function getTodo() {
await networkRequest();
return ["청소하기", "밥먹기"];
}
async function getData() {
const name = await getUser();
const todos = await getTodo();
return [name, todos];
}
const data = getData();
data.then((d) => console.log(d));
출력 결과
[ '홍길동', [ '청소하기', '밥먹기' ] ]
위 예제에서 getUser()와 getTodo()는 각각 2초의 시간이 걸리는 비동기 함수입니다. 하지만 await 키워드를 통해, 마치 동기 코드처럼 위에서 아래로 자연스럽게 작성할 수 있습니다. 이 덕분에 비동기 작업의 흐름을 더 명확하게 파악할 수 있습니다.
✅ async 함수에서의 에러 처리
비동기 함수에서도 에러 처리는 매우 중요합니다. async/await 문법에서는 try...catch 구문을 사용하여 에러를 다룰 수 있습니다.
async function getUser() {
// 일부러 에러 발생
throw new Error("에러가 발생했어요!");
await networkRequest();
return "홍길동";
}
async function getTodo() {
await networkRequest();
return ["청소하기", "밥먹기"];
}
async function getData() {
let user;
try {
user = await getUser();
} catch (error) {
console.log(error.message); // 에러 메시지를 출력
user = "익명"; // 에러 발생 시 기본값 처리
}
const todos = await getTodo();
return [user, todos];
}
const data = getData();
data.then((d) => console.log(d));
출력 결과
에러가 발생했어요!
[ '익명', [ '청소하기', '밥먹기' ] ]
위처럼 try...catch를 활용하면 특정 함수에서 에러가 발생하더라도, 전체 코드의 흐름을 안전하게 이어갈 수 있습니다. 특히 사용자 정보나 외부 API 호출에서 오류가 잦을 수 있기 때문에, 반드시 예외 처리를 해주는 것이 좋습니다.
✅ Fetch API와 async/await의 활용
실제로 많이 쓰이는 패턴 중 하나는 fetch() API와 async/await을 함께 사용하는 것입니다.
async function fetchData() {
const response = await fetch("https://jsonplaceholder.typicode.com/users");
const data = await response.json();
console.log(data);
}
fetchData();
이 코드는 다음과 같은 순서로 작동합니다
- fetch()를 통해 비동기적으로 데이터를 요청합니다.
- await 키워드 덕분에 응답이 도착할 때까지 기다립니다.
- .json() 메서드를 호출해 응답을 JSON으로 변환합니다.
- 변환된 데이터를 출력합니다.
이전에는 .then()을 여러 번 중첩해서 사용해야 했지만, async/await을 활용하면 코드가 훨씬 깔끔하고 가독성도 높아집니다.
✅ 마무리 정리
- async 함수는 항상 Promise를 반환하며, 내부에서 await을 사용해 비동기 흐름을 제어할 수 있습니다.
- await을 사용하면 복잡한 .then() 체인 없이도 비동기 작업을 순차적으로 처리할 수 있습니다.
- try...catch를 통해 async 함수 내부에서 발생하는 에러를 안전하게 처리할 수 있습니다.
- fetch API처럼 Promise 기반 함수들과 함께 사용하면 더욱 강력한 패턴을 구성할 수 있습니다.