자바스크립트 async/await를 이용한 리팩토링

리팩토링은 소프트웨어의 가독성, 유지보수성 및 성능을 향상시키기 위해 코드를 개선하는 과정입니다. 이를 위해 자바스크립트에서 제공하는 async/await 패턴을 활용하여 비동기 코드를 리팩토링할 수 있습니다.

1. 비동기 코드 이해하기

비동기 코드는 네트워크 요청, 파일 읽기/쓰기, 데이터베이스 조회 등과 같이 시간이 걸리는 작업을 수행할 때 사용됩니다. 자바스크립트에서는 비동기 작업에 콜백 함수를 사용하는 것이 일반적이었으나, 이는 콜백 헬과 코드의 복잡성을 야기할 수 있습니다.

예를 들어, 다음과 같은 비동기 작업을 수행하는 함수가 있다고 가정합니다.

function fetchData(callback) {
  setTimeout(() => { // 비동기 작업 시뮬레이션
    const data = 'Some data';
    callback(data);
  }, 1000);
}

위 함수는 1초 후에 ‘Some data’를 콜백 함수 callback에 전달합니다.

2. async/await 이해하기

async/await는 ES2017부터 도입된 자바스크립트의 비동기 작업 처리 패턴입니다. 이를 사용하면 비동기 코드를 동기적으로 작성할 수 있으며, 콜백 헬을 피하고 코드를 간결하게 유지할 수 있습니다.

async/await를 사용하여 위의 fetchData 함수를 리팩토링해보겠습니다.

function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => { // 비동기 작업 시뮬레이션
      const data = 'Some data';
      resolve(data);
    }, 1000);
  });
}

async function getData() {
  const data = await fetchData();
  console.log(data);
}

getData();

fetchData 함수는 프로미스를 반환하도록 변경되었습니다. 이제 getData 함수에서 await 키워드를 사용하여 fetchData의 비동기 작업이 완료될 때까지 대기하고 데이터를 가져올 수 있습니다. 마지막으로, getData 함수를 호출하여 비동기 작업을 시작할 수 있습니다.

3. 예외 처리

async/await를 사용하면 예외 처리도 간편해집니다. try/catch 문을 사용하여 예외를 처리할 수 있습니다.

async function getData() {
  try {
    const data = await fetchData();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

위 예제에서 fetchData 호출 시 발생하는 예외를 try/catch 문으로 처리할 수 있습니다.

4. 병렬 비동기 작업

async/await를 사용하여 병렬로 비동기 작업을 수행할 수도 있습니다. Promise.all 메소드를 사용하여 여러 프로미스를 병렬로 실행할 수 있습니다.

async function getMultipleData() {
  try {
    const [data1, data2] = await Promise.all([fetchData(), fetchData()]);
    console.log(data1, data2);
  } catch (error) {
    console.error(error);
  }
}

getMultipleData();

위 예제에서는 Promise.all을 사용하여 두 개의 fetchData 함수가 모두 완료될 때까지 대기한 다음, 비동기 작업의 결과를 배열로 받아옵니다.

5. 정리

async/await는 자바스크립트 비동기 작업 처리를 간결하고 가독성있게 만들어주는 강력한 도구입니다. 이를 이용하여 비동기 코드를 리팩토링하면 콜백 헬을 피하고 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 따라서 async/await를 적극적으로 사용하여 코드를 개선하는 것을 권장합니다.