본문 바로가기
JavaScript

[JS] async/await

by goblin- 2024. 9. 20.

async/await는 JavaScript에서 비동기 작업을 처리하는 데 사용되는 구문입니다. 이것은 Promise 기반 코드를 보다 간결하고 직관적으로 작성할 수 있게 도와줍니다. 먼저 Promise와 관련된 기본 개념을 이해한 후, async/await를 사용하는 방법을 설명하겠습니다.

 

1. Promise 복습

 

JavaScript의 Promise는 비동기 작업의 성공 또는 실패를 나타내는 객체입니다. 이를 사용하면 비동기 작업의 완료 시점에 대한 처리를 할 수 있습니다.

const myPromise = new Promise((resolve, reject) => {
  // 비동기 작업
  const success = true;

  if (success) {
    resolve('작업 성공');
  } else {
    reject('작업 실패');
  }
});

myPromise
  .then(result => {
    console.log(result);  // 작업 성공
  })
  .catch(error => {
    console.log(error);  // 작업 실패
  });

 

2. async/await 개념

 

async/await는 위와 같은 Promise 기반 코드를 더 직관적으로 작성할 수 있게 해주는 기능입니다. async 키워드는 함수 앞에 붙여서 그 함수를 비동기 함수로 만들며, await 키워드는 Promise가 해결될 때까지 기다린 후 그 값을 반환합니다.

 

async 함수: 함수 앞에 async 키워드를 붙이면, 그 함수는 항상 Promise를 반환합니다. 비동기 작업에서 값을 반환하면 자동으로 resolve되고, 예외가 발생하면 자동으로 reject됩니다.

await 키워드: awaitPromise가 해결될 때까지 기다립니다. await는 반드시 async 함수 안에서만 사용할 수 있습니다.

 

3. 사용법

 

기본 예시

async function fetchData() {
  const result = await fetch('https://api.example.com/data');
  const data = await result.json();
  console.log(data);
}

fetchData();

위 코드는 fetch 함수를 사용해 데이터를 비동기로 가져오는 작업을 합니다. awaitfetch가 완료될 때까지 기다렸다가, 그 결과를 받아 다음 작업을 수행합니다.

 

에러 처리

 

비동기 작업에서 오류가 발생할 수 있으므로, try...catch 구문을 사용해 오류를 처리하는 것이 일반적입니다.

async function fetchData() {
  try {
    const result = await fetch('https://api.example.com/data');
    const data = await result.json();
    console.log(data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

 

 

4. async/await의 장점

 

코드 가독성: async/await는 코드가 동기 방식으로 작성된 것처럼 보여 가독성이 높아집니다.

에러 처리의 간소화: try...catch 구문을 사용하면 기존의 then, catch 체인보다 예외 처리 방식이 명확해집니다.

프로미스 체인 단순화: 여러 개의 Promise를 사용하는 경우, then을 중첩하지 않고 await로 순차적으로 비동기 작업을 처리할 수 있습니다.

 

프로미스 체인 예시:

fetchData()
  .then(result => {
    return processData(result);
  })
  .then(finalResult => {
    console.log(finalResult);
  })
  .catch(error => {
    console.error(error);
  });

위의 코드를 async/await로 변환하면 다음과 같이 단순화됩니다:

async function handleData() {
  try {
    const result = await fetchData();
    const processedResult = await processData(result);
    console.log(processedResult);
  } catch (error) {
    console.error(error);
  }
}

handleData();

 

 

5. 병렬 실행

 

await는 기본적으로 Promise를 직렬적으로 실행하게 만드는데, 여러 개의 비동기 작업을 병렬로 실행하고 싶다면 Promise.all()을 사용할 수 있습니다.

async function fetchMultipleData() {
  const [data1, data2] = await Promise.all([
    fetch('https://api.example.com/data1'),
    fetch('https://api.example.com/data2')
  ]);

  const result1 = await data1.json();
  const result2 = await data2.json();

  console.log(result1, result2);
}

fetchMultipleData();

위 코드는 두 개의 API 요청을 병렬로 실행하여 효율적으로 데이터를 가져옵니다.

 

6. 결론

 

async/await는 복잡한 비동기 처리를 동기 코드처럼 작성할 수 있도록 도와주는 매우 유용한 기능입니다. 이를 사용하면 비동기 작업의 흐름을 더 직관적으로 제어할 수 있고, 에러 처리를 깔끔하게 할 수 있습니다. Promise를 기반으로 동작하므로 Promise의 기본 개념을 이해하는 것이 중요합니다.

'JavaScript' 카테고리의 다른 글

[JS] 얕은복사, 깊은복사  (2) 2024.09.08
[JS] Promise  (0) 2024.09.08
[JS] 자바스크립트의 동작방식(비동기,동기)  (0) 2024.09.08
[JS] Callback  (0) 2024.09.08
[JS] 함수와 클래스(this)  (0) 2024.09.08