콜백
Callback
다른 함수에 인자로 전달되어 나중에 호출되는 함수. 비동기 프로그래밍의 기초. 콜백 지옥 주의.
Callback
다른 함수에 인자로 전달되어 나중에 호출되는 함수. 비동기 프로그래밍의 기초. 콜백 지옥 주의.
콜백(Callback)은 다른 함수에 인자로 전달되어 특정 시점에 호출되는 함수입니다. "나중에 다시 호출해줘(call back)"라는 의미에서 이름이 유래했으며, 이벤트 처리, 비동기 작업 완료 처리, 사용자 정의 동작 주입 등에 광범위하게 사용됩니다.
JavaScript에서 콜백은 비동기 프로그래밍의 기초입니다. 파일 읽기, HTTP 요청, 타이머 등 시간이 걸리는 작업이 완료되면 콜백 함수가 호출됩니다. 이 패턴을 통해 메인 스레드를 블로킹하지 않고 비동기 작업을 처리할 수 있습니다.
콜백의 단점은 중첩이 깊어지면 "콜백 지옥(Callback Hell)"이 발생한다는 것입니다. 여러 비동기 작업을 순차적으로 처리해야 할 때 코드가 피라미드 형태로 들여쓰기되어 가독성이 급격히 저하됩니다. 이를 해결하기 위해 Promise와 async/await가 등장했습니다.
콜백 패턴은 함수형 프로그래밍에서도 핵심적인 역할을 합니다. map, filter, reduce 같은 고차 함수들은 콜백을 받아 컬렉션의 각 요소를 처리합니다. 이벤트 리스너, 정렬 비교 함수, 미들웨어 등도 모두 콜백 패턴의 변형입니다.
// JavaScript 콜백 예제
// 1. 기본 콜백
function greet(name, callback) {
console.log(`Hello, ${name}!`);
callback();
}
greet('Alice', () => console.log('Callback executed!'));
// 2. 비동기 콜백 (타이머)
console.log('Start');
setTimeout(() => {
console.log('2초 후 실행');
}, 2000);
console.log('End');
// 3. 에러 우선 콜백 (Node.js 패턴)
function readFile(path, callback) {
// callback(error, data) 형태
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
callback(err, null);
return;
}
callback(null, data);
});
}
// 4. 콜백 지옥 예시 (안티패턴)
getUser(userId, (user) => {
getOrders(user.id, (orders) => {
getOrderDetails(orders[0].id, (details) => {
// 점점 깊어지는 중첩...
});
});
});
// 5. 배열 메서드와 콜백
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);
const evens = numbers.filter(n => n % 2 === 0);
시니어: 이 레거시 코드, 콜백이 5단계나 중첩되어 있네요.
주니어: Promise로 리팩토링해야 할까요?
시니어: 네, 각 콜백을 Promise 반환 함수로 바꾸고 async/await로 평탄화하면 훨씬 읽기 쉬워져요. util.promisify도 유용해요.
면접관: 콜백과 Promise의 차이점을 설명해주세요.
지원자: 콜백은 함수를 인자로 전달하는 패턴이고, Promise는 비동기 작업의 결과를 나타내는 객체입니다. Promise는 체이닝이 가능해서 콜백 지옥을 피할 수 있고, catch로 에러를 일괄 처리할 수 있습니다.
면접관: 에러 우선 콜백(error-first callback)이란?
지원자: Node.js의 관례로, 콜백의 첫 번째 인자가 에러 객체입니다. 에러가 없으면 null이고, 있으면 에러 정보가 담깁니다. callback(err, result) 형태로 사용합니다.
리뷰어: 이 콜백 에러 처리가 빠져있어요. 실패하면 어떻게 되나요?
작성자: 아, 성공 케이스만 생각했네요.
리뷰어: 에러 우선 패턴을 따르거나, Promise로 감싸서 try-catch로 처리하세요. 에러가 삼켜지면 디버깅이 정말 어려워요.