본문 바로가기

Node.js공부/예제를 통한 Node.js 공부

node.js 공부 4- Callback function

반응형

1. Callback Function 이란?

JavaScript에서는 함수(function)은 Object 타입이다. (String, Array, Number등등..) function 자체가 객체이므로 변수안에 담을수도 있고, 인수로써 다른 함수에 전달 해 줄 수 도 있고, 함수에서 만들어질 수도 있고, 반환될 수도 있다.


Callback function은, 특정 함수에 매개변수로서 전달된 함수를 지칭합니다. 그리고, Callback function은 그 함수를 전달받은 함수 안에서 호출되게 한다.


jQuery에서 사용된 callback function 예제를 살펴보자.

$ ("#btn_1").click(function() {

alert("Btn 1 Clicked");

});


위의 소스코드는, click 메소드에 이름이 없는 callback function이 인수로 전달된다. 

jQuery안의 click 메소드는, 마우스 클릭이 있으면 callback function을 호출하게 설정한다. 




2. 콜백함수를 사용하는 이유는?

callback 함수를 사용하여 프로그램의 흐름을 끊지 않음으로서, Non-blocking 코드를 사용하는 서버는 Blocking 코드를 사용하는 서버보다 더 많은 양의 요청을 빠르게 처리 할 수 있게됩니다.


*Node 어플리케이션의 비동기식 함수에서는 첫번째 매개변수로는 error, 마지막 매개변수로는 callback 함수를 받습니다. 





3. 이벤트와 콜백함수의 차이점?

Node.js 기반으로 만들어진 서버가 가동되면, 변수들은 initialize하고, 함수를 선언하고 이벤트가 일어날 때까지 기다린다.

이벤트 위주 어플리케이션에서는, 이벤트를 대기하는 메인 루프가 있다. 그리고 이벤트가 감지되었을 때, Callback함수를 호출한다.

이벤트가 콜백과 비슷해보여도, 차이점은 콜백함수는 비동기식 함수에서 결과를 반환할 때 호출되지만, 이벤트 핸들링은 옵저버 패턴에 의해 작동된다.

이벤트를 대기하는 함수들이 옵저버 역할을 하고, 옵저버들이 이벤트를 기다리다가 이벤트가 실행되면 이벤트를 처리하는 함수가 실행됩니다.


Node.js에는 events모듈과 EventEmitter 클래스가 내장되어 있는데, 이를 사용하여 이벤트와 이벤트 핸들러를 연동(bind) 시킬 수 있다.


//events 모듈 사용

var events = require('events');


//EventEmitter 객체 생성

var eventEmitter = new events.EventEmitter();


이벤트 핸들러와 이벤트를 연동시키는 건 다음과 같다.


// event 와 EventHandler를 연동(bind)

// eventName은 임의로 설정 가능

eventEmitter.on('eventName', eventHandler);


프로그램 안에서 이벤트를 발생시킬 땐 다음 코드를 사용한다.

eventEmitter.emit('eventName');




4. 이벤트 핸들링 예제

//events 모듈 사용

var events = require('events');


//EventEmitter 객체 생성

var eventEmitter = new events.EventEmitter();


//EventHandler 함수 생성

var connectHandler = function connected(){

console.log("Connection Successful");


//data_received 이벤트를 발생시키기

eventEmitter.emit("data_received");

}


//connection 이벤트와 connectHandler 이벤트 핸들러를 연동

eventEmitter.on('connection', connectHandler);


//data_received 이벤트와 익명함수와 연동

//함수를 변수암에 담는 대신에, .on() 메소드의 인자로 직접 함수를 전달

eventEmitter.on('data_received', function(){

console.log("Data Received");

});


//connection 이벤트 발생시키기

eventEmitter.emit('connection');


console.log("Program has ended);



OUTPUT


$node main.js

Connection Succesful

Data Received

Program has ended 


공부 출처: https://velopert.com/255



반응형

'Node.js공부 > 예제를 통한 Node.js 공부' 카테고리의 다른 글

Node.js 공부 6 - EJS  (0) 2019.02.05
Node.js 공부 5 - express  (0) 2019.01.31
Node.js 공부 3 - npm  (0) 2019.01.31
Node.js공부 2 - 맛보기  (0) 2019.01.31
Node.js 공부 1  (0) 2019.01.31