전통적인 프로그래밍 언어들에 있어서 프로그래밍 방식이란 순차적으로 실행되는 형식을 취합니다. 쉽게  말해서 

var a = FunctionA () ; // 10 초 걸림
var b = FunctionB () ; // FunctionA 가 실행된지 10초 후에 실행됨 


이러한 방식으로 앞에 실행된 것(FunctionA)이 완벽하게 끝나야지만 다음 것(FunctionB)이 실행됩니다.
너무나 당연한가요? 사실 순차적으로 실행되는 것은 Node.js 에서도 일반적인 방식입니다. 다만 약간의 차이가 있을 뿐입니다. 

Node.js 에서 위 함수가 실행되는 방식을 알아보기로 할까요? 

var a = FunctionA () ; // 10 초 걸림
var b = FunctionB () ; // FunctionA 가 실행된후 바로 실행됨 


FunctionA 는 실행이 완료되기 까지 10초가 걸리지만 바로 리턴됩니다. (어딘가에서는 실행이 계속 되고 있겠지요?) 그리고 FunctionB 가 바로 실행이 됩니다. 

이렇게 실행되는 방식이 Asynchronous 하게 실행된다고 합니다. 또 이렇게 실행되는 이유는 Node.js 가  Event-Driven 방식이기 때문입니다. 

여기서 잠깐..

 
만약 전통적인 프로그래밍 방식에서 FunctionA 와 FunctionB 가 동시적으로 실행되게 할려면 어떻게 할까요? Thread 프로그래밍을 통해서 두 함수가 동시적으로 실행되게 할수 있습니다. 

반면 실행 자체가 Event-Driven 이어서 Asynchronous 하게 실행이 되지만 Node.js 에서는 Concurrency 문제가 없습니다. (Lock/Mutex 개념을 신경 쓸 필요가 없습니다)


그러면 Node.js 에서 Synchronous 하게 실행하려면 어떻게 해야 할까요? 즉 FunctionA 가 실행이 완료된 후에 FunctionB 가 실행이 되게 할려면? 

이래서 CallBack 이라는 개념이 등장합니다. 제 기억에서 콜백(Callback) 개념은 윈도우 프로그램을 할 때 등장합니다. OS 가 불러주는 개념으로 배웠었는데 여기에서는 어떤 단위함수가 작업을 끝마치고 불러주는 개념으로 통합니다. 

Node.js 의 Asynchronous 형식의 함수들은 100% Callback 함수를 인자로 받아들이게 되어 있습니다. 

FunctionA ( FunctionB ()); // 10초 걸림
var c = FunctionC () ;


이런 형식으로 부르게 됩니다. 위 코드는 FunctionA 를 실행하고 바로 리턴되서 FunctionC 를 실행합니다. 그리고10초 있다가 (FunctionA 가 끝날 때 까지 걸리는 시간) FunctionB 가 실행됩니다. 

이게 일반적인 Node.js 의 Asynchronous 방식입니다. 

그러면 끝으로 Node.js 에서 Synchronous 형식으로 되어 있는 함수와 Asynchronous 형식으로 되어 있는 함수의 차이를 살펴보고 리턴값을 어떻게 처리하는 지 살펴보겠습니다. 중요한 부분이라 꼭 이해하고 넘어가야 합니다. 

fs.readFile(filename, [callback]);

이라는 함수가 있습니다. 파일 이름과 callback 함수를 인자로 받습니다. Asynchronous 함수입니다. callback 을 받으니 당연하겠지만, 그리고 non-blocking 함수 입니다. 이 말인 즉슨 실행하고  바로 리턴한다는 뜻입니다. 

fs.readFileSync(filename);


이라는 함수가 있습니다. Asynchronous 함수에 Sync 가 붙어 있고 callback 함수를 인자로 받아들이지 않습니다. Synchronous 함수란 뜻입니다. 그리고 함수가 다 실행될 때까지 다음 것이 실행되지 않으니 blocking 함수입니다.

Synchronous 함수는 결과를 리턴합니다. 

var data = fs.readFileSync('/etc/passwd');


반면 Asynchronous 함수는 결과를 Callback 함수에게 넘겨 줍니다. 

fs.readFile('/etc/passwd' , function(err, data) { .. });


Sync 방식의 함수에서의 Return 값인 data 가 Async 방식에서는 Callback 함수의 인자로 넘겨지는 것을 확인할 수가 있습니다. 

이런 방식이 주는 혼란점은 나중에 다뤄 보기로 하겠습니다. 



+ Recent posts