본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 3

node js logo image

 

 

 

 

 

 

앞의 아티클에서는, 동기-블로킹 방식으로 readFile을 구현하는 예제를 살펴보았었습니다. 

 

 

 

4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 2

앞선 아티클에서 설명했다시피, 동기 / 비동기는 블로킹 / 논 블로킹과 비슷해 보이지만 엄연히 다른 개념이라는 것을 알아둬야 합니다.    4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 1우

nozeroslope.tistory.com

 

 

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);
    });