IMCAT.DEV
로그인 가입
JavaScript 중급 비동기

JavaScript 콜백 지옥 이해 및 해결

JavaScript 콜백 지옥 이해 및 해결 — 중급

콜백 지옥 이해 및 해결

1. 도입 (왜 배워야 하는가)

JavaScript는 비동기 프로그래밍을 지원하는 언어입니다. 이 비동기 처리 방식은 웹 애플리케이션의 성능을 크게 향상시킬 수 있지만, 동시에 관리가 어려운 '콜백 지옥' 문제를 초래할 수 있습니다. 콜백 지옥은 중첩된 콜백 함수가 여러 층으로 쌓여 가독성을 떨어뜨리고, 유지보수를 어렵게 만듭니다. 이런 문제를 해결하지 않으면 코드가 복잡해지고, 버그 발생 가능성이 높아지며, 팀원 간의 협업이 어려워질 수 있습니다.

2. 핵심 개념 설명

콜백(callback) 함수는 다른 함수의 인자로 전달되어, 특정 작업이 완료된 후 호출되는 함수를 의미합니다. 비유하자면, 레스토랑에서 음식을 주문하고, 주방장이 요리가 끝나면 손님을 호출하는 것과 같습니다. 주방장이 손님을 부르는 것이 콜백 함수의 역할입니다.

용어설명
콜백 함수다른 함수의 인자로 전달되어 실행되는 함수
비동기 처리작업이 완료되기를 기다리지 않고 다음 작업을 진행하는 방식
프로미스비동기 작업의 완료 또는 실패를 처리할 수 있는 객체

3. 기본 코드 예제

먼저, 콜백 지옥을 보여주는 간단한 예제를 살펴보겠습니다.

function firstTask(callback) {
    setTimeout(() => {
        console.log("첫 번째 작업 완료");
        callback(); // 콜백 호출
    }, 1000);
}

function secondTask(callback) {
    setTimeout(() => {
        console.log("두 번째 작업 완료");
        callback(); // 콜백 호출
    }, 1000);
}

function thirdTask() {
    console.log("세 번째 작업 완료");
}

// 콜백 지옥
firstTask(() => {
    secondTask(() => {
        thirdTask();
    });
});

실행 결과:

첫 번째 작업 완료
두 번째 작업 완료
세 번째 작업 완료

코드 한 줄씩 동작 설명:

  1. firstTask 함수를 호출하고, 작업이 완료되면 callback을 호출하라는 인자를 전달합니다.
  2. 첫 번째 작업이 완료되면 1초 후 "첫 번째 작업 완료" 메시지가 출력됩니다.
  3. callback이 호출되어 secondTask가 실행됩니다.
  4. 두 번째 작업도 같은 방식으로 진행되어 "두 번째 작업 완료" 메시지가 출력됩니다.
  5. 마지막으로 thirdTask가 호출되어 "세 번째 작업 완료" 메시지가 출력됩니다.
  6. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰에서 사용자가 상품을 장바구니에 추가하는 경우를 생각해봅시다.

    function addToCart(item, callback) {
        setTimeout(() => {
            console.log(${item}이 장바구니에 추가되었습니다.);
            callback(); // 다음 작업으로 넘어갑니다.
        }, 1000);
    }
    
    // 장바구니에 상품 추가
    addToCart("사과", () => {
        addToCart("바나나", () => {
            addToCart("오렌지", () => {
                console.log("장바구니에 모든 상품이 추가되었습니다.");
            });
        });
    });

    예제 2: 데이터 로드 후 처리

    서버에서 데이터를 로드한 후 다음 작업을 수행하는 예제입니다.

    function fetchData(callback) {
        setTimeout(() => {
            console.log("데이터 로드 완료");
            callback(); // 데이터 로드 후 다음 작업 실행
        }, 1000);
    }
    
    // 데이터 로드 후 후속 작업
    fetchData(() => {
        console.log("데이터를 처리합니다.");
    });

    5. 흔한 실수와 주의사항

    실수 1: 콜백 함수의 누락

    • 잘못된 코드:
    • firstTask(); // 콜백을 제공하지 않음
    • 올바른 코드:
    • firstTask(() => {
          console.log("콜백을 제공해야 함");
      });

      실수 2: 비동기 작업의 순서 혼돈

    • 잘못된 코드:
    • secondTask(() => {
          thirdTask(); // firstTask가 완료되기 전에 호출됨
      });
    • 올바른 코드:
    • firstTask(() => {
          secondTask(() => {
              thirdTask();
          });
      });

      6. 정리

    • 콜백 지옥은 중첩된 콜백 함수로 인해 코드 가독성을 떨어뜨립니다.
    • 콜백 함수를 이해하고, 비동기 처리를 적절히 관리하는 것이 중요합니다.
    • 비동기 작업을 효율적으로 처리하기 위해 프로미스나 async/await 문법을 학습하는 것이 좋습니다.
    • 다음에 학습하면 좋은 주제: 프로미스(Promise), async/await.