이벤트 중심 아키텍쳐는 Node.js 에게 무언가를 실행하도록 지시하고 그런다음
멀티 스레딩을 사용하는 운영 체제로 해당 프로세스를 보낸다.
-
응답을 보냈다고 이벤트 리스너가 죽은것은 아니다.
-
이벤트 리스너 코드를 만나면 코드를 즉시 실행하는 것이 아니라 이벤트 리스너에 등록 해놓는다.
-
그리고 이벤트가 요청되면 콜백 함수를 실행한다.
-
writeFileSync vs writeFile
-
writeFileSync
파일을 쓰기 전까지 다음 코드를 실행하지 않는다. (동기) 작은 텍스트를 보낼 때는 상관없지만 큰 파일일 경우는 실행 속도에 제한을 둔다. -
writeFile
파일을 쓰기전에 다음 코드를 실행한다. 인자로 callback 함수를 줄 수 있다.fs.writeFile('message.txt', message, err => { // 인자 res.statusCode = 302; res.setHeader('Location', '/'); return res.end(); });
-
요약하자면 Node.js는 이벤트 리스너를 통해 코드 실행을 잠시 저장하고 다음 코드를 실행한다. 그리고 이벤트가 들어오면 콜백 함수를 실행한다. 따라서 성능이 뛰어나다.
Node.js 가 작동하는 방식
Request > Server (Code [By single JavaScript Thread] ) > Event Loop (Handle Event Callbacks) or Worker Pool
실행 가능한 함수들은 Worker Pool 로 보내지고 이벤트 콜백은 Event Loop 에 저장 된다. 이후 이벤트가 실행된다.
블로킹은 한 작업을 시작할 때 다음코드로 넘어가지 않는 패턴이고 논 블로킹은 비동기적 방식을 이용해 이벤트 루프에 콜백함수를 저장하는 패턴을 말한다.
-
블로킹
파일을 불러 올 때까지 시간이 걸린다.const fs = require('fs'); const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 console.log(data);
-
논 블로킹 올바른 처리를 하기 위해
fs.unlink를 fs.readFile 콜백함수 안에 사용했다.const fs = require('fs'); fs.readFile('/file.md', (readFileErr, data) => { if (readFileErr) throw readFileErr; console.log(data); fs.unlink('/file.md', (unlinkErr) => { if (unlinkErr) throw unlinkErr; }); });