[NodeJS] Callback Function, Blocking Code, Non-Blocking Code

2017. 11. 7. 11:11JavaScript/NodeJS

1. Callback Function


NodeJS는 Event driven programming(이벤트 반응형 프로그램) 개념을 가지고 있으며, 이 개념은 특정 이벤트가 발생되면 미리 이벤트에 Binding 된 함수가 실행 되는 것이다. 결과 적으로 해당 함수가 언제 호출되는지 알 수가 없다.


이처럼 Binding되어 실행된 결과를 처리하는 함수를 Callback Function라고 하는데...


예를 들어 jQuery에서 사용된 Callback Function 살펴보자.


var callback = function(result) {

console.log("Callback Data : " + result);

}


$.get("/endpoint", callback);


이와 같이 callback 함수는 $.get() 이 실행되어 결과값이 올때에만 실행 되어진다.


이러한 이벤트 방식은 Windows나 Java Swing 같은 GUI 프로그램에서 Mouse Event 발생 시 사용되는 Callback 함수와 동일 하다고 볼 수 있다.


왜 이렇게 장황하게 Callback Function에 대해서 나열을 하냐면... 음...


NodeJS는 Event 를 발생해 놓고, 코드를 Blocking 상태에서 기다리게 하는 것이 아니라, Event에 대한 요청이 끝나면 미리 Binding 해 놓은 Callback 함수를 실행하는 형태(Non-Blocking)이다. 한마디로 비동기 형식....??




2. Blocking Code


일반적으로 사용하는 Programming 형태라고 할 수 있다.

코드가 순차적으로 실행되면서 어떠한 이벤트 또는 함수가 완료 될 때까지 진행하지 않고 기다리는 형태이다.


var fs = require("fs");


var data = fs.readFileSync("hello.txt");


console.log(data.toString());

console.log("프로그램 종료");


해당 소스의 결과는 


안녕하세요, Hello World 입니다.

프로그램 종료


이렇게 순차적으로 파일을 읽은 후 파일 내용을 출력하고 마지막으로 프로그램종료를 출력하게 된다.




3. Non-Blocking Code


Blocking Code와 다르게 실행 함수가 끝날때 까지 기다리는 것이 아니라 바로 아래 코드를 실행하고, 실행 함수의 작업이 다 끝나면 Callback Function 를 호출하는 형태이다.


한마디로 던져 놓고 결과가 올때까지 기다리는 비동기 형태의 프로그램이라고 할 수 있다.


var fs = require("fs");


fs.readFile("hello.txt", function(err, data) {

if( err ) return console.error(err);    //오류 출력

console.log(data.toString());

});


console.log("프로그램 종료");


해당 소스의 결과는 


프로그램 종료

안녕하세요, Hello World입니다.


결과 적으로 fs.readFile() 함수가 끝나기 전에 바로 다음 명령을 실행하게 됩니다.

그렇다고 하여 프로그램이 종료 된것은 아니고 fs.readFile() 함수가 종료 될때 까지 기다리게 된다.