우리는 이제까지 노드에 대해서 학습하면서 동기 방식, 비동기 방식 메서드에 대해서 살펴보았습니다. 개념적으로 동기 / 비동기 방식에 대해서 살펴보았는데, 지금부터는 동기 / 비동기 메서드에 대해서 좀 더 심도 깊게 살펴보도록 하겠습니다.
우선 예제 폴더에 [readme2.txt]를 생성합니다.
[readme2.txt]
반복 조회 테스트 중
const fs = require('fs');
console.log('**START**');
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1번', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('2번', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('3번', data.toString());
});
console.log('###END###');
/* 출력
**START**
###END###
1번 반복 조회 테스트 중
2번 반복 조회 테스트 중
3번 반복 조회 테스트 중
*/
/* 출력(재실행)
2번 반복 조회 테스트 중
1번 반복 조회 테스트 중
3번 반복 조회 테스트 중
*/
위와 같이 예제를 동일한 파일로 반복 실행할 경우, 우리의 의도나 예상과는 약간 다른 결과가 출력됩니다. [***START***]을 출력하고 fs.readFile( )을 실행한 다음 [###END###]를 출력할 것이라 예상했는데, 스타트와 엔드를 모두 출력한 다음 파일을 읽어서 출력합니다. 심지어, 실행할 때 마다 순서도 달라집니다.
기본적으로 '비동기 메서드'들은 백그라운드에 "해당 파일을 읽을 것"이라는 요청만 보내고 바로 다음 작업으로 넘어갑니다. 파일을 실제로 읽어서 출력하는 것은 다음 문제입니다. 즉, "해당 파일을 읽을 것"이라는 요청만 3회 보내고, 그 다음 즉시console.log('###END###')를 출력해 버리는 것입니다.
이렇게 비동기 메서드는 백그라운드에 파일 읽기를 요청하고, 다음 작업을 수행합니다. 그리고 파일 읽기가 완료되면 백그라운드는 다시 메인 스레드에 읽기가 완료되었음을 알립니다. 그때가 되어야 메인 스레드는 콜백 함수(여기서는 출력)를 실행하게 되는 것입니다.
이론상 수백개의 I/O 요청이 발생해도, 메인 스레드는 백그라운드에 요청 처리를 모두 위임하는 것입니다. 백그라운드가 아무리 많은 요청이 있어도, 완료되는 대로 콜백 함수를 처리하면 되는 것이니 꽤 괜찮은 방법입니다.
* 참고로 위 예제에서 백그라운드는 세 개의 요청을 거의 동시에 실행하는데, 백그라운드 상에서 파일 읽기 작업을 처리하는 방식은 스레드 풀 아티클에서 다룹니다.
그런데 여기서, 동기 / 비동기, 블로킹 / 논 블로킹에 대한 의문이 생깁니다. 비슷한 개념인 듯한데 setTimeout( )을 다룰 때 설명했던 블로킹과 논블로킹과의 차이는 무엇일까요? 이는 다음 아티클에서 살펴보겠습니다. 일단 지난번 아티클에서 논블로킹과 관련된 내용을 먼저 리뷰하도록 하겠습니다.
논블로킹 관련 아티클은 다음을 참고하세요.
논블로킹 기준 백그라운드, 호출 스택 관련 내용은 다음을 참고하세요.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 3 (0) | 2024.05.17 |
---|---|
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 2 (0) | 2024.05.17 |
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 2 (0) | 2024.05.10 |
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 1 (0) | 2024.05.08 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 10 [child_process] (0) | 2024.05.07 |