이벤트 루프(https://bellsilver7.tistory.com/315)를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.
우리가 작성한 자바스크립트 코드는 동시에 실행될 수 없습니다. 하지만 파일 시스템 접근(파일 읽기, 쓰기, 생성 등)이나 네트워크 요청 같은 I/O(입출력) 작업은 동시에 처리될 수 있습니다. 이런 작업은 논블로킹 방식으로 처리하는 방법을 제공합니다.
논블로킹이란? 이전 작업이 완료될 때까지 대기하지 않고 실행함을 뜻합니다.
블로킹과 논블로킹
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹됩니다.
console.log(data);
moreWork(); // console.log 이후 실행될 것입니다.
주석으로 설명한 것과 같이 moreWork()가 실행되기 위해서는 console.log 의 실행이 완료된 이후 입니다.
하지만 아래의 코드는 조금 다릅니다.
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
moreWork(); // console.log 이전에 실행될 것입니다.
fs.readFile()가 논블로킹이므로 memoWork()가 먼저 호출될 것입니다.
블로킹과 논블로킹 코드를 섞을 때 위험성
파일을 읽은 후에 읽은 파일을 삭제 하려면 어떻게 해야할까요?
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.unlinkSync('/file.md');
논블로킹 방식으로 파일을 읽었지만 삭제하는 코드를 동기 코드로 사용한다면 존재하지 않는 파일을 삭제하는 상황이 발생할 것입니다.
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;
});
});
이처럼 삭제하는 코드를 fs.readFile()의 콜백 안에서 처리하게 되면 작업 순서를 올바르게 보장할 수 있습니다.
I/O 작업이 없는 코드라면?
I/O 작업이 없더라도 논블로킹 방법이 의미가 없지는 않습니다. 오래 걸리는 작업을 논블로킹을 적용해 실행 순서를 변경한다면 다음에 오는 간단한 작업들이 대기하고 있는 상황을 방지할 수 있기 때문입니다.
[참조]
https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking/
(도서) Node.js 교과서 개정 2판
'Develop > Javascript' 카테고리의 다른 글
[Node.js] 싱글스레드 (0) | 2022.12.23 |
---|---|
[Node.js] 이벤트 기반 (0) | 2022.12.20 |
[node.js] Chat with WebSocket (0) | 2022.07.26 |
자바스크립트 자료형 #2 객체와 배열 (0) | 2020.03.17 |
자바스크립트 자료형 #1 기본 자료형 (0) | 2020.03.17 |
댓글