node.js에서 callback함수는 특정 작업이 완료된 후에 호출되는 함수
다른 함수의 인수로 전달되는 함수로 비동기 작업을 처리할 때 사용
- argument로 넘겨 받는 함수
- 외부함수에 의해서 호출 되는 함수
- 비동기 처리에 유용함
node.js는 비동기, 논블로킹(Nom-blocking) 방식으로 작동함
IO작업(파일 읽기, 데이터베이스 쿼리 등)이 끝날 때 까지 기다리지 않고
다음 작업을 시작함.
이때, 비동기 작업이 끝난 후 실행할 코드가 필요함 -> 콜백 함수
(순차적으로 진행해야하는 일이 있을 때, CPU를 효율적으로 사용하기 위해서)
const fs = require('fs');
// 비동기적으로 파일을 읽는 예시
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.log('파일 읽기 오류:', err);
return;
}
console.log('파일 내용:', data);
});
- 파일을 비동기적으로 읽음
세번째 인수로 콜백 함수를 받아, 파일 읽기가 완료되면 호출
-> err : 오류가 발생하면 오류 정보를 전달
-> data : 파일의 내용이 정상적으로 읽히면 내용을 전달
function greet(name, callback) {
console.log(`Hello, ${name}!`);
callback(); // 콜백 함수 호출
}
// 콜백 함수 정의
function sayGoodbye() {
console.log('Goodbye!');
}
// greet 함수 호출 시 콜백 함수로 sayGoodbye 전달
greet('Alice', sayGoodbye);
- name과 콜백 함수 callback을 인수로 받음
- greet 함수는 이름을 출력한 후, callback()을 호출하여 sayGoodbye를 실행
"Hello, Alice!"가 먼저 출력 후, "Goodbye!"를 출력
- 비동기 작업 처리: 비동기적으로 실행되는 작업이 끝난 후 실행할 작업을 콜백 함수로 정의할 수 있어 프로그램이 대기하지 않고 다른 작업을 계속할 수 있음
- 유연성: 코드에서 필요한 부분을 콜백 함수로 전달해 재사용 가능한 구조를 만들 수 있음
콜백 함수가 중첩되면 가독성이 떨어지고,
코드 관리가 어려워지는 상황을 콜백 지옥이라고 함
fs.readFile('file1.txt', 'utf8', (err, data1) => {
if (err) throw err;
fs.readFile('file2.txt', 'utf8', (err, data2) => {
if (err) throw err;
fs.readFile('file3.txt', 'utf8', (err, data3) => {
if (err) throw err;
console.log(data1, data2, data3);
});
});
});
이를 보완하기 위해 promise, async/await를 사용함