티스토리 뷰

Node.js 를 시작하면서 제일 먼저, 혹은 많이 듣게 되는 이야기가 콜백지옥이다. 그런 상태로 노드를 접하고 사용하기 시작하니 혼란을 부르는 부분이 있는데 이번에 콜백(callback)을 대해 정리를 하는 시간을 갖도록 해본다. 언어든 기술이든 기초가 중요하고 기초를 탄탄히 하면 콜백지옥에서 어느순간 자연스럽게 벗어날 수 있지 않을까?

노드(정확히는 자바스크립트)에서 함수는 일급 객체로 취급된다. 위키백과를 참고하면 일급 객체가 되기 위해서는 아래 조건이 충족되어야 한다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

이 말을 이해하기 위해서 아래 코드를 잠시 살펴보자. 프로그래밍 함수 부분 입문 수준의 코드이다.

function foo(a, b)
{
    console.log("i'm foo(), a:%s, b:%s", a, b);
}

foo(1, 2);

foo 라는 함수를 선언해줬고 a, b 두 개의 매개변수를 처리하고 있다. 결과는 뻔하지만 아래와 같다.

$ node foo.js
i'm foo(), a:1, b:2

여기에 콜백을 추가해보자. 위에 코드와 달라진 점을 잘 확인하면 되겠다.

function foo(a, b, callback)
{
    console.log("i'm foo(), a:%s, b:%s", a, b);
    callback('success call foo()');
}

foo(1, 2, function(msg){
    console.log(msg);
});

foo() 함수에 함수 객체가 매개변수로 추가된 형상이다. 처리 순서를 보면 foo 가 실행되고 마지막에 callback 을 부른다. 이는 마치 일반적인 프로그래밍에서 return 을 하는 것과 유사하게 foo() 함수의 세번째 인자인 functino(msg) { } 로 회귀된다. 여기서 사용된 callback 이라는 단어는 노드나 자바스크립트에서 특수하게 사용되는 예약어(reserved word)가 아님을 명심하자. 동작을 가장 잘 표현하고 있기 때문에 범용적으로 사용되고 있는 단어이다. 실행결과는 아래와 같다.

$ node foo.js
i'm foo(), a:1, b:2
success call foo()

함수를 한단계 더 만들어보자.

function bar(callback)
{
    callback('success call bar()');
}

function foo(a, b, callback)
{
    console.log("i'm foo(), a:%s, b:%s", a, b);
    bar(callback);
}

foo(1, 2, function(msg){ console.log(msg); });

우리가 흔히 사용하는 return 결과를 위로 올려보내는 것과 같은 이치로 이렇게 callback 을 위로 계속 올려 보낼 수도 있다. 뻔한 실행결과는 아래와 같다.

$ node foo.js
i'm foo(), a:1, b:2
success call bar()

사실 여기까지는 크게 어려운게 없이 술술 읽힌다. 하지만 callback 에 꽃은 asynchronous 로 동작하는 모듈을 사용하는 경우가 되겠다. 사실 이런 경우에 우리는 콜백지옥이라는 단어를 마주하게된다. 다음 글에서는 그와 관련된 이야기를 풀어보도록 하자.

댓글
댓글쓰기 폼