• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

파일 시스템(fs 모듈)과 콜백에 대해 궁금한게 있습니다.

18.09.26 20:13 작성 조회수 185

0

fs 모듈 강좌중에 궁금한 점이 있어서 질문 올립니다. 일단 강좌중에 나온 코드 먼져 보시죠.

이하는 코드 입니다.


 const fs = require('fs');
fs.writeFile('./writeme.txt', '글을 써주세요', (err)=>
{
if(err){
throw err;

}

fs.readFile('./writeme.txt', (err, data)=>{<p>    if (err) {</p><p>        throw err;</p><p>    }</p><p>    console.log(data);</p><p>    console.log(data.toString());</p>

})

})```

위와 같은 코드라면 처음에 콜백시에 execution stack이 쌓이고, 실행은 거꾸로 된다고 하셨는데, 그렇다면 위에서도

fs.readFile(~~ 어쩌고 저쩌고 ~~ 콜백)이 fs.writeFile 보다 먼저 실행 되어야 하는거 아닌가요?

그렇다면 결국, 없는 파일을 불러와서 에러가 나와야 하는데...

이 부분이 잘 이해가 안갑니다. ㅜ.ㅜ

마찬가지로, 그다음에 나오는(콜백들을 이용해서 동기 방식처럼 구현하는 부분)에서도, 나중에 호출된 콜백들이 먼저 실행 되어야 하는거 아닌가요? ㅇ,.ㅇ;

답변 3

·

답변을 작성해보세요.

0

ryu sin님의 프로필

ryu sin

질문자

2018.09.27

답변 감사합니다. 이벤트리스너의 콜백은 타스크 큐로 들어간다는것을 답변 듣고, 지난 강좌 복습후에 알았습니다. 좋은 하루 되세요.

0

글로 설명하기 너무 힘드네요. 콜백과 같은 비동기는 다음과 같이 생각하시는 게 편합니다. 비동기는 "순서"의 문제입니다.
fs.writeFile();
fs.readFile();
writeFile의 콜백();
readFile의 콜백();

0

호출스택과 이벤트루프 예시로 실행 순서를 알려드리겠습니다.

  1. fs.writeFile이 호출스택에 들어갔다가 실행돼서 나가고, 백그라운드에 쓰는 작업이 전달됩니다.
  2. fs.readFile이 호출스택에 들어갔다가 실행돼서 나가고, 백그라운드에 읽는 작업이 전달됩니다.
  3. 백그라운드에서는 쓰는 작업이 먼저 될 것입니다(쓰는 와중에 읽기가 시작될 수도 있습니다).
  4. 다 쓰고 나면 writeFile의 콜백이 태스크큐에 들어갔다가, 이벤트루프에 의해 호출스택으로 불려와 실행되고,
  5. 읽은 후 readFile의 콜백이 태스크큐에 들어갔다가, 이벤트루프에 의해 호출스택으로 불려와 실행됩니다.

콜백은 그냥 호출스택에 쌓이지 않습니다. 이벤트루프를 거쳐야 하고요. 콜백은 태스크 큐에 들어온 순서 실행됩니다.
잘못 알고 계신 부분은 writeFile과 readFile이 둘 다 동시에 호출스택에 들어가있다고 생각하시는 부분입니다. 아래 코드를 첨부합니다.
fs.writeFile(); // 호출 스택에 writeFile이 들어감
// 이 상황에서 이미 fs.writeFile은 호출스택에서 빠져나옵니다(할 일을 다 했기 때문).
fs.readFile(); // 빈 호출스택에 readFile이 들어감
콜백을 이용해서 동기식으로 처리하는 게 가능한 이유는
fs.writeFile(() => { // 호출 스택에 writeFile()이 들어감
// writeFile이 나가고 writeFile 콜백이 이벤트루프를 거쳐 호출스택에 들어옴
fs.readFile(); // 호출스택에 writeFile 콜백이 있고, 그 위에 readFile이 쌓임
})