본문 바로가기
코딩 공부/JavaScript

[JS] async와 await

by 현장 2023. 12. 9.

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

Inpa Dev

'코딩 공부 > 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