프로그래밍/Javascript

자바스크립트 비동기 프로그래밍 완벽 가이드: 콜백부터 async/await까지

shimdh 2025. 2. 14. 11:12
728x90

비동기 프로그래밍은 현대 웹 개발에서 필수적인 개념입니다. 네트워크 요청, 파일 입출력, 데이터베이스 조회 등 실행 시간이 긴 작업을 효율적으로 처리할 수 있도록 도와주며, 사용자 경험을 향상시키는 핵심 요소로 자리 잡았습니다. 특히 자바스크립트는 단일 스레드 기반의 언어이기 때문에, 비동기 프로그래밍을 제대로 활용하지 않으면 프로그램이 멈추는 등의 문제가 발생할 수 있습니다.

이번 포스트에서는 자바스크립트에서 비동기 프로그래밍을 다루는 가장 기본적인 방법인 콜백(callback) 함수에 대해 깊이 있게 살펴보고, 더 나아가 콜백 헬(callback hell) 문제와 이를 해결하는 프로미스(Promise)async/await 패턴까지 소개하겠습니다.


📌 비동기 프로그래밍이란?

비동기 프로그래밍(Asynchronous Programming)은 특정 코드가 실행될 때 그 결과를 기다리지 않고, 다른 작업을 병렬적으로 처리할 수 있도록 하는 방식입니다. 즉, 실행 시간이 긴 작업이 발생하더라도 프로그램이 멈추지 않고 계속해서 실행될 수 있도록 합니다.

⏳ 동기(Synchronous) vs 비동기(Asynchronous)

  • 동기 방식: 하나의 작업이 끝날 때까지 다음 작업을 실행하지 않는 방식.
  • 비동기 방식: 특정 작업을 실행하는 동안 다른 작업도 동시에 실행할 수 있는 방식.
// 동기 방식: 코드가 순차적으로 실행됨
console.log("작업 시작");
for (let i = 0; i < 5; i++) {
    console.log(i);
}
console.log("작업 완료");
// 비동기 방식: setTimeout을 사용하여 비동기 처리
console.log("작업 시작");
setTimeout(() => {
    console.log("비동기 작업 실행");
}, 2000);
console.log("작업 완료");

위 예제에서 setTimeout을 사용한 비동기 작업은 즉시 실행되지 않고, 2초 뒤에 실행됩니다. 그동안 프로그램은 다른 코드를 계속 실행할 수 있습니다.


🔹 콜백 함수란?

콜백 함수(Callback Function)란 특정 작업이 완료된 후 실행되는 함수를 의미합니다. 비동기 프로그래밍에서 중요한 역할을 하며, 주로 비동기 함수의 인자로 전달되어 작업이 끝난 후 호출됩니다.

✅ 콜백 함수의 원리

  1. 비동기 함수를 호출하고 콜백 함수를 인자로 전달합니다.
  2. 비동기 작업이 완료될 때까지 프로그램이 계속 실행됩니다.
  3. 작업이 완료되면 전달된 콜백 함수가 호출됩니다.

✅ 콜백 함수 예제

function fetchData(callback) {
    console.log("데이터를 불러오는 중...");
    setTimeout(() => {
        const data = { id: 1, name: "홍길동" };
        console.log("데이터 준비 완료!");
        callback(data);
    }, 2000);
}

fetchData((result) => {
    console.log("받은 데이터:", result);
});

위 코드에서 fetchData 함수는 데이터를 가져오는 비동기 함수이며, callback 함수를 통해 데이터를 처리하도록 설계되었습니다. 2초 후 데이터를 가져온 후 콜백을 실행하여 결과를 출력합니다.


⚠️ 콜백 헬 (Callback Hell) 문제

콜백 함수는 유용하지만, 여러 개의 비동기 작업이 연속적으로 실행될 경우 코드가 깊어지고 가독성이 떨어지는 문제(콜백 헬) 가 발생합니다.

❌ 콜백 헬 예제

getUser(userId, function (user) {
    getPosts(user.id, function (posts) {
        getComments(posts[0].id, function (comments) {
            console.log(comments);
        });
    });
});

이러한 중첩된 코드 구조(피라미드 구조) 는 유지보수가 어렵고 디버깅이 힘들어지는 단점이 있습니다.


✅ 콜백을 대체하는 방법

콜백 헬 문제를 해결하기 위해, 자바스크립트에서는 프로미스(Promise)async/await을 도입하였습니다.

1️⃣ 프로미스 (Promise)

프로미스는 비동기 작업의 상태를 관리하는 객체입니다. .then()을 사용하여 콜백 대신 체이닝 방식으로 가독성을 높일 수 있습니다.

getUser(userId)
    .then((user) => getPosts(user.id))
    .then((posts) => getComments(posts[0].id))
    .then((comments) => console.log(comments))
    .catch((error) => console.error("에러 발생:", error));

2️⃣ async/await

async/await을 사용하면 코드가 동기적으로 실행되는 것처럼 보이게 만들어 더욱 깔끔한 구조를 유지할 수 있습니다.

async function fetchData() {
    try {
        const user = await getUser(userId);
        const posts = await getPosts(user.id);
        const comments = await getComments(posts[0].id);
        console.log(comments);
    } catch (error) {
        console.error("에러 발생:", error);
    }
}

fetchData();

async/await의 장점:

  • 코드가 직관적으로 읽히며 가독성이 뛰어남
  • try-catch를 사용하여 에러 처리를 쉽게 할 수 있음
  • 복잡한 비동기 처리를 간결하게 표현할 수 있음

🎯 결론

비동기 프로그래밍은 현대 웹 개발에서 필수적인 개념이며, 이를 구현하는 방식으로 콜백, 프로미스, async/await이 있습니다.

  • 콜백 함수는 기본적인 비동기 처리 방법이지만, 콜백 헬 문제를 일으킬 수 있음
  • 프로미스를 사용하면 체이닝 방식으로 가독성을 높일 수 있음
  • async/await은 코드의 직관성을 유지하면서도 비동기 작업을 더욱 쉽게 다룰 수 있도록 도와줌
728x90