본문 바로가기

Dev.BackEnd/Node.js

[네번째] Node.js 기본 / 동기&비동기 개념



기와 비동기
Synchronous(동기) vs Asynchronous(비동기)
줄여서 Sync, Async 로 표현한다.

실생활에서의 비유를 통한 설명
> 상황 : 세 가지 일을 해야한다. 빨래. 설거지. 청소 각각 한시간씩 걸린다.

동기적으로 일을 처리하는 것
빨래를 하고 다 하고 나서 그 다음에 설거지를 하고 다 하고 나서 그 다음에 청소를 한다.
총 3시간이 걸린다.

비동기적으로 일을 처리하는 것
빨래하는 업체가 있고 설거지 하는 업체가 있고 청소를 하는 업체가 있다.
그 빨래업체에게 전화를 한다. "빨래 좀 해주세요. 끝나면 말해주세요." 전화를 하는데 1분이 걸렸다.
그 설거지업체에게 전화를 한다. "설거지 좀 해주세요. 끝나면 말해주세요." 전화를 하는데 1분이 걸렸다.
그 청소업체에게 전화를 한다. "청소 좀 해주세요. 끝나면 말해주세요." 전화를 하는데 1분이 걸렸다.
전화를 하는데 총 3분이 걸렸다.
뭐가 먼저 될지는 모른다. 이게 단점이 될 수 있다.
하지만 순서가 중요하지 않다면 이렇게 처리할 수 있다.
다른 업체에 의해 일이 처리되는 동안에 나는 다른 일을 처리할 수 있다.
즉, 자원을 효율적으로 활용할 수 있다는 장점이 있다.

이 차이다.

컴퓨터에서 구체적인 예
> 이메일 전송 프로그램
상황 : 100명에게 보낸다. 한 명당 10초가 걸린다.
동기로 처리하는 경우 : 발행! -> 한 명, 한명... 총 1000초가 걸린다.
비동기로 처리하는 경우 : 발행! -> 발행 시스템에게 전송 업무를 위임한다. 전송 완료 메세지만 받으면 된다.

 
코드로 살펴본다.
Node.js 라이브러리에서 검색해본 결과
fs.readFile / fs.readFileSync 두 가지가 검색되었다.
Sync 라는 단어가 있고 없고 한다.
Node.js 는 추구하는 철학이 기본적으로 비동기다.
그래서 없으면 비동기 방식, 있으면 동기 방식.
기본적으로 시간이 필요한 작업들은 (I/O가 필요한 작업들은) 기본적으로 비동기적으로 처리한다.

두 메서드에 관한 문법은 Docs에 나와있다.
fs.readFileSync(file[, options])
fs.readFile(file[, options], callback)


코드)
var fs = require('fs');

//sync
console.log(1);
var data = fs.readFileSync('data.txt', {encoding:'utf8'});
console.log(data);

//async
console.log(2);
fs.readFile('data.txt', {encoding:'utf8'},function(err, data){
    console.log(3);
    console.log(data);
    console.log(5);
});
console.log(4);

실행결과)
1
Hello Sync and Async
2
4
3
Hello Sync and Async
5

코드분석)
"3, Hello Sync and Async, 5"는 data 부분이다.
‘2'출력 -> data.txt readFile ‘요청' -> ‘4' 출력 -> 요청에 의한 ‘응답' 완료 = ‘data’ 출력
-> 3,data,5 출력(3,5는 function에 속해있기 때문에 data와 함께 출력)

function(err,data) 이므로 err에 대하여, 즉 error 상황을 고려하여
if 구문으로 분기를 구분해줘야 한다.
하지만 지금 포스팅에선 Skip하겠다.

우리는 동기 방식과 비동기 방식을 적재 적소에 위치시켜서 웹 브라우저의 반응 속도를 최대화시킬 수 있다.

 



생활코딩 감사합니다.

-...-