노드에서 이 비동기 방식 콜백을 많이쓰는 이유는
기본적으로 노드JS는 단일 스레드로 구성이 돼있기 때문이다.
그래서 파일에서 데이터를 다 읽을 때까지 백그라운드에서 무거운 일을 하고 콜백함수도 등록한다.
I/O 작업(파일 읽기, 네트워크 요청 등)은 백그라운드에서 실행되고, 완료되면 콜백 함수 실행
파일 읽기

콜백함수 동작방식
노드가 해당 파일을 읽기 시작하고 준비가되는 즉시에 지정한 콜백함수가 실행이된다.

해당 파일을 읽기 시작하고 다음줄 코드로 넘어가 “읽기 파일 동작” 이 코드를 읽고,
파일이 완전히 읽혔을 때 콜백 함수가 실행돼 텍스트가 출력이 된다.
파일 읽기 안에 파일 읽기


start.txt의 파일 내용을 출력하고
read-this.txt 파일 내용을 출력 할 거다.
파일명 대신 변수로

data1에 내용이 data2의 파일 이름가 동일하므로 변수로 data1을 변수로 받아줘 파일명으로 대체한다.
출력

파일안에 파일 읽기 + 파일작성

추가적으로 이 파일까지 같이 출력 해볼거다.
또한 작성 할 것이다.


글 쓰기는 파일명 뒤에, 넣을 데이터, 확장자, 콜백함수 순으로 온다.
⚡ 핵심 개념: 이벤트 루프(Event Loop)
Node.js는 싱글 스레드 기반이지만, 비동기 작업을 처리할 때 **이벤트 루프(Event Loop)**를 사용한다.
📌 정확한 동작 방식
- 동기 코드(Synchronous Code) 먼저 실행
console.log('읽기 파일 동작');
처럼 즉시 실행 가능한 코드는 **콜 스택(Call Stack)**에서 바로 실행된다.
- 비동기 작업(Async Task)은 백그라운드로 이동
fs.readFile()
같은 비동기 함수는 **Node.js의 백그라운드(Worker Pool)**에서 실행된다.- 파일을 읽는 동안 이벤트 루프는 다른 동기 코드 실행을 계속 진행한다.
- 파일 읽기가 끝나면 콜백 큐(Callback Queue)로 이동
- 비동기 작업이 완료되면 콜백 함수가 **태스크 큐(Task Queue)**에 들어간다.
- 이벤트 루프는 현재 실행 중인 코드가 끝날 때까지 대기한 후, 큐에서 콜백을 꺼내 실행한다.
콜백지옥 대체 함수 async
위 코드는 가독성이 떨어지는 부분이 있으니 async로 함수로 대체하여 기능은 그대로인 상태에서 가독성은 챙기자
const fs = require('fs').promises; // fs의 Promise 버전 사용
async function processFiles() {
try {
const data1 = await fs.readFile('./starter/txt/start.txt', 'utf-8');
const data2 = await fs.readFile(`./starter/txt/${data1}.txt`, 'utf-8');
console.log(data2);
const data3 = await fs.readFile(`./starter/txt/append.txt`, 'utf-8');
console.log(data3);
await fs.writeFile('./starter/txt/final.txt', `${data2} \n ${data3}`, 'utf-8');
console.log('파일이 작성됐습니다.');
} catch (err) {
console.error('오류 발생:', err);
}
}
console.log('읽기 파일 동작');
processFiles();
Share article