async와 await
ES2017에 도입된 문법으로서, Promise 로직을 더 쉽고 간결하게 사용할 수 있게 해줍니다. 유의해야 할 점이 async/await가 Promise를 대체하기 위한 기능이 아니라는 것입니다. 내부적으로는 여전히 Promise를 사용해서 비동기를 처리하고, 단지 코드 작성 부분을 프로그래머가 유지보수하게 편하게 보이는 문법만 다르게 해줄 뿐이라는 것입니다.
🏷️ async와 await 기본 사용법
async 와 await 는 절차적 언어에서 작성하는 코드와 같이 사용법도 간단하고 이해하기도 쉽습니다. function 키워드 앞에 async 만 붙여주면 되고, 비동기로 처리되는 부분 앞에 await 만 붙여주면 됩니다.
// 기존 Promise.then() 형식
function main() {
delay(1000)
.then(() => {
return delay(2000);
})
.then(() => {
return Promise.resolve('끝');
})
.then(result => {
console.log(result);
});
}
// async/await 방식
async function main() {
await delay(1000);
await delay(2000);
const result = await Promise.resolve('끝');
console.log(result);
}
예시 코드를 보면 promise는 then 메서드를 연속적으로 사용하여 비동기 처리를 하지만, async/await는 await 키워드로 비동기 처리를 기다리고 있다는 것을 직관적으로 표현하고 있음을 볼 수 있습니다. async/await의 장점은 비동기적 접근방식을 동기적으로 작성할 수 있게 해주어 코드가 간결해지며 가독성을 높여져 유지보수를 용이하게 해준다.
🏷️ async 키워드
// 함수 선언식
async function func1() {
// 생략
}
// 함수 표현식
const func2 = async () => {
// 생략
}
await를 사용하기 위한 선언문 정도로 이해하면 되는데 function 앞에 async을 붙여줌으로써, 함수내에서 await 키워드를 사용할 수 있게 됩니다. 이는 반대로 말하면 await 키워드를 사용하기 위해선 반드시 async function 정의가 되어 있어야 한다는 말과 같습니다.
✔️ async 리턴값은 Promise 객체입니다.
async function에서 어떤 값을 리턴하든 무조건 프로미스 객체로 감싸져 반환 된다는 특징을 알 수 가 있습니다.
✔️다른 Promise 상태를 반환할 수 있습니다.
직접 프로미스 정적 메서드를 통해 다음과 같이 프로미스 상태(state)를 다르게 지정하여 반환이 가능합니다.
reject 같은 경우 위와 같이 Promise.reject() 정적 메서드를 통해 반환되는 프로미스 상태를 실패(rejected) 상태로 지정해줄 수 있지만, async 함수 내부에서 예외 throw 를 해도 실패 상태의 프로미스 객체가 반환됩니다.
🏷️ await 키워드
// await 방식
async function func() {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
// data 처리
console.log(data);
}
promise 비동기 처리가 완료될때 까지 코드 실행을 일시 중지하고 기다린다라는 뜻으로 보면 됩니다. await 키워드를 사용하면 then 핸들러를 복잡하게 처리할 필요 없이, 심플하게 비동기 함수 왼쪽에 await 만 명시해주고 결과값을 변수에 받도록 코드를 정의하면 끝입니다. then과 콜백 함수를 남발하여 코드가 들여쓰기로 깊어지는 것을 방지하고, 한 줄 레벨에서 코드를 나열하여 가독성을 높일 수 있습니다.
📖 Reference
'코딩 공부 > JavaScript' 카테고리의 다른 글
[JS] Vite (3) | 2024.10.29 |
---|---|
[Axios / Vue / Pinia] Axios를 사용할 때, JWT token 정보와 같이 요청하는 방법 (0) | 2024.10.05 |
[React] Formik (0) | 2023.12.03 |
[React] useEffect (0) | 2023.12.02 |
[React] React Context (1) | 2023.11.29 |