Node.js Async/Await 사용법: 비동기 프로그래밍 쉽게 배우기

작성일 :

Node.js Async/Await 사용법: 비동기 프로그래밍 쉽게 배우기

Node.js는 비동기 프로그래밍을 위한 다양한 방법을 제공합니다. 그 중에서도 Async/Await는 코드의 가독성을 높여주고, 콜백 지옥(callback hell)을 피할 수 있는 훌륭한 도구입니다. 이 글에서는 Async/Await의 개념부터 시작해, 실제로 어떻게 사용하는지 그리고 몇 가지 예제를 통해 비동기 프로그래밍을 보다 쉽게 처리하는 방법을 배워보겠습니다.

Async/Await의 기본 개념

비동기 프로그래밍은 많은 현대 애플리케이션에서 필수적으로 사용됩니다. 하지만 콜백 함수나 Promise만을 사용하면 코드가 복잡해지고 유지보수가 어려워질 수 있습니다. Async/Await는 이러한 문제를 해결하기 위해 등장한 문법입니다.

Async/Await의 기본적인 동작 방식은 다음과 같습니다:

  • async 함수는 항상 Promise를 반환합니다. 함수 안에서 await 키워드를 사용할 수 있게 해줍니다.
  • await 키워드는 Promise를 기다립니다. 이때 await는 비동기 함수의 실행을 일시 중지시키고, Promise가 해결(resolved)될 때까지 기다립니다.
  • 코드가 동기 처리되는 것처럼 보이게 하지만, 실제로는 비동기적으로 처리됩니다.

Async/Await 사용법

async 함수 선언

먼저, async 함수는 일반 함수처럼 선언할 수 있습니다. 단, 함수 앞에 async 키워드를 붙여야 합니다.

javascript
async function fetchData() {
    // 비동기 작업 처리
}

또는 함수 표현식으로도 선언할 수 있습니다.

javascript
const fetchData = async () => {
    // 비동기 작업 처리
};

await 사용

await 키워드는 async 함수 내부에서만 사용할 수 있습니다. await 키워드는 Promise가 해결될 때까지 기다리며, 해결된 Promise의 결과를 반환합니다.

javascript
async function fetchData() {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
}

위의 코드에서 fetch 함수는 네트워크 요청을 보내는 Promise를 반환합니다. await fetch(...)는 이 Promise가 해결될 때까지 기다린 후 response 변수를 반환합니다. 같은 방식으로 response.json()Promise를 반환하며, await를 사용해 이를 기다리면 JSON 데이터가 data 변수에 할당됩니다.

Error Handling(에러 처리)

Async/Await를 사용할 때는 try...catch 구문을 통해 에러를 처리할 수 있습니다.

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

try 블록 안에서 await 키워드를 사용하면, Promise가 거부(rejected)될 경우 catch 블록에서 에러를 처리할 수 있습니다.

실제 예제

이번에는 실제로 Async/Await를 사용해 간단한 예제를 만들어 보겠습니다. 사용자 정보를 가져오는 API가 있다고 가정해보겠습니다.

javascript
const fetch = require('node-fetch'); // Node.js 환경에서는 fetch 모듈 필요

async function getUserData(userId) {
    try {
        // 사용자 정보 API 호출
        const response = await fetch(`https://api.example.com/users/${userId}`);
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const userData = await response.json();
        return userData;
    } catch (error) {
        console.error('Error fetching user data:', error);
    }
}

// 함수 호출
getUserData(1).then(userData => {
    console.log(userData);
});

위의 예제는 사용자 정보를 가져오는 getUserData라는 async 함수를 사용합니다. 이 함수는 주어진 userId를 받아 API 호출을 통해 사용자 정보를 받아옵니다. 여기서도 try...catch 구문을 사용해 에러를 처리하고 있습니다.

여러 비동기 작업의 처리

때로는 여러 개의 비동기 작업을 순차적으로 처리해야 할 때가 있습니다. 예를 들어, 여러 사용자 정보를 순차적으로 가져오고자 할 때 Async/Await를 사용할 수 있습니다.

javascript
async function getMultipleUsers(userIds) {
    const users = [];
    for (const id of userIds) {
        const user = await getUserData(id);
        users.push(user);
    }
    return users;
}

getMultipleUsers([1, 2, 3]).then(users => {
    console.log(users);
});

위 코드에서는 for 루프를 사용해 주어진 userIds 배열의 각 아이디에 대해 getUserData 함수를 호출하고, 결과를 리스트에 추가합니다. 이렇게 하면 순차적으로 각 사용자의 데이터를 가져올 수 있습니다.

결론

Async/Await는 Node.js에서 비동기 프로그래밍을 보다 직관적이고 쉽게 해주는 강력한 도구입니다. Promise와 콜백 함수로 작성된 복잡한 비동기 코드를 단순하고 가독성 좋게 바꿔줍니다. 이 글에서는 Async/Await의 기본 개념부터 사용법, 에러 처리, 그리고 실제 예제까지 다루어 보았습니다. 앞으로 비동기 프로그래밍을 할 때 Async/Await를 활용해 코드를 더욱 효율적으로 작성해보세요.