본문 바로가기

Programming/Node.js

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

node js logo image

 

 

 

 

 

우리는 이제까지 노드에 대해서 학습하면서 동기 방식, 비동기 방식 메서드에 대해서 살펴보았습니다. 개념적으로 동기 / 비동기 방식에 대해서 살펴보았는데, 지금부터는 동기 / 비동기 메서드에 대해서 좀 더 심도 깊게 살펴보도록 하겠습니다. 

 

우선 예제 폴더에 [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( )을 다룰 때 설명했던 블로킹과 논블로킹과의 차이는 무엇일까요? 이는 다음 아티클에서 살펴보겠습니다. 일단 지난번 아티클에서 논블로킹과 관련된 내용을 먼저 리뷰하도록 하겠습니다.

 

 

 

논블로킹 관련 아티클은 다음을 참고하세요.

 

 

 

1. Node.js 핵심 개념 이해 (3) - Non Blocking I/O

이번 아티클에서는 오래 걸리는 [작업]에 대한 효율적인 처리를 살펴보도록 하겠습니다. 기본적으로 자바스크립트를 통한 작업은 (1) 동시에 실행할 수 있는 작업과 (2) 동시에 실행할 수 없는 작

nozeroslope.tistory.com

 

 

 

논블로킹 기준 백그라운드, 호출 스택 관련 내용은 다음을 참고하세요.

 

 

 

1. Node.js 핵심 개념 이해 (2) - Event Driven, Context [2/2]

앞선 내용에서, 자바스크립트와 노드의 이벤트 관련 원리들에 대해서 기본적인 설명을 진행했습니다. 이번 아티클을 읽기 위한 사전 지식이니 혹시라도 기억이 나지 않는다면 다시 한번 살펴보

nozeroslope.tistory.com