앞선 아티클에서 설명했다시피, 동기 / 비동기는 블로킹 / 논 블로킹과 비슷해 보이지만 엄연히 다른 개념이라는 것을 알아둬야 합니다.
기본적으로 동기, 블로킹에 따른 구분은 아래와 같이 요약할 수 있습니다.
· 동기, 비동기 : 백그라운드 작업의 완료 상태를 확인하는지 여부
· 블로킹, 논-블로킹 : 함수가 바로 return 되는지 여부
위의 아티클에서 살펴보았던 fs.readFile( ) 메서드는 비동기 메서드였습니다. 여기서는 백그라운드에서 파일을 읽는 작업이 완료되었는지를 확인하지 않고 바로 console.log( )를 실행했었죠? 만일 동기 메서드라면 해당 파일을 읽는 작업이 완료되었는지를 확인하고 (콜백)함수가 실행되었을 것입니다.
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1번', data.toString());
});
블로킹과 논블로킹의 구분은, 어떠한 (콜백)함수를 호출할 때, 백그라운드 상에서 즉시 return을 하는지 여부로 결정된다고 했습니다. 사실 동기/비동기 구분과 거의 비슷한 느낌이지만, 어쨌든 관념상 다른 개념입니다. 즉, 논-블로킹일 경우에는 (콜백)함수를 호출할 경우 바로 return처리를 합니다. 그럼 다른 작업을 메인 스레드가 수행하게 됩니다. 그리고 나중에 백그라운드가 알림을 주게 되면, 비로소 해당 (콜백)함수를 처리를 하는 것이죠.
실제로 노드에서는 [동기-블로킹 방식] / [비동기-논 블로킹] 방식이 대부분입니다. 이외의 경우는 사실상 없다고 봐도 무방합니다. 그래서 실제로는 두 방식이 같은 것처럼 보이는 것입니다. 다소 개념적인 구분이니, 잘 이해가 가지 않는다면 반복해서 학습해보시기 바랍니다.
그럼, 앞서 작성했던 다음 비동기-논블로킹 예제를 동기-블로킹 형식으로도 바꾸어 보겠습니다.
[비동기-논블로킹]
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###
3번 반복 조회 테스트 중
2번 반복 조회 테스트 중
1번 반복 조회 테스트 중
*/
[동기-블로킹]
const fs = require('fs');
console.log('**START**');
let data = fs.readFileSync('./readme2.txt');
console.log('1번', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('2번', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('3번', data.toString());
console.log('###END###');
/* 출력
**START**
1번 반복 조회 테스트 중
2번 반복 조회 테스트 중
3번 반복 조회 테스트 중
###END###
*/
위와 같이 동기-블로킹 방식에서는 fs.readFileSync( )라는 동기형 메서드를 사용했습니다. 이에 대해서 다음 아티클에서 살펴보겠습니다.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 1 (0) | 2024.05.20 |
---|---|
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 3 (0) | 2024.05.17 |
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 1 (0) | 2024.05.13 |
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 2 (0) | 2024.05.10 |
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 1 (0) | 2024.05.08 |