앞의 아티클에서는, 동기-블로킹 방식으로 readFile을 구현하는 예제를 살펴보았었습니다.
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###
*/
눈치채셨을수도 있지만, 이러한 동기 메서드들은 메서드 명에 Sync가 붙습니다. 위 예제와 같이 코드도 이해하기 쉽고, 단순해지는 장점(?)이 있지만 실제로 이를 사용하는 경우는 초기화 작업 외에는 드뭅니다.
이유는 단순하지만 '성능' 때문이지요. Sync계열 동기 메서드를 사용하게 되면 이전 작업이 완료 된 다음에야 그 이후의 작업이 수행 가능합니다. 메인 스레드가 백그라운드 작업 시간 동안 리소스를 낭비하게 되는 꼴이지요.
그럼 비동기 메서드를 사용하면서도 순서를 통제하는 방법이 있으면 어떨까요? 방법은 다소 무식(?)하고 단순합니다. readFile 메서드의 콜백에 다음 readFile을 넣는 것입니다.
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('*끝*');
});
});
});
/* 출력
*START*
1번 반복 조회 테스트 중
2번 반복 조회 테스트 중
3번 반복 조회 테스트 중
끝
*/
위와 같은 '콜백 지옥'은 Promise나 async/await로 해결할 수 있겠죠?
const fs = require('fs');
console.log('*START*');
fs.readFile('./readme2.txt')
.then((data) => {
console.log('1번', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('2번', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('3번', data.toString());
console.log('END');
})
.catch((err) => {
console.err(err);
});
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 2 (0) | 2024.05.21 |
---|---|
4. Node 기능 살펴보기 (7) - 버퍼와 스트림 1 (0) | 2024.05.20 |
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 2 (0) | 2024.05.17 |
4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 1 (0) | 2024.05.13 |
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 2 (0) | 2024.05.10 |