학습
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();
});
});
실행 결과:
첫 번째 작업 완료
두 번째 작업 완료
세 번째 작업 완료
코드 한 줄씩 동작 설명:
firstTask함수를 호출하고, 작업이 완료되면callback을 호출하라는 인자를 전달합니다.- 첫 번째 작업이 완료되면 1초 후 "첫 번째 작업 완료" 메시지가 출력됩니다.
callback이 호출되어secondTask가 실행됩니다.- 두 번째 작업도 같은 방식으로 진행되어 "두 번째 작업 완료" 메시지가 출력됩니다.
- 마지막으로
thirdTask가 호출되어 "세 번째 작업 완료" 메시지가 출력됩니다. - 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
- 콜백 지옥은 중첩된 콜백 함수로 인해 코드 가독성을 떨어뜨립니다.
- 콜백 함수를 이해하고, 비동기 처리를 적절히 관리하는 것이 중요합니다.
- 비동기 작업을 효율적으로 처리하기 위해 프로미스나 async/await 문법을 학습하는 것이 좋습니다.
- 다음에 학습하면 좋은 주제: 프로미스(Promise), async/await.
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();
});
});