Frameworks/Node.js

[Node.js 강좌] 10. Callback 함수란 무엇인가 ?

양디 2016. 1. 15. 20:02

Callback 함수


흔히 Node.js 에 대한 정보들을 검색하다 보면, Callback 지옥에 빠진다 ! 라는 글이 눈에 종종 띈다.


그렇다면 Callback 함수 는 무엇인가 ?


아주 간단한 예로 이해해보자.


콜백 함수 의 이름에서부터 알 수 있듯이, 전화를 다시 하다 (?) 라는 뜻이다. (물론 그런 의도가 아니었을지라도)


친구들과 즐겁게 시내를 돌아다니다가, 집에 갈 때 사갈 떡볶이를 사가려고 한다.

그런데 이게 무슨일이람. 떡볶이가 너무 많이 밀려서 시간이 조금 걸린다고 한다 !

그래서 나는 전화번호를 주고, 조리가 끝나면 받아갈테니 전화를 다시 주라고 하였다!


무슨 말인지 이해가 왔는가 ? 그렇다면 독자는.. 정말 똑똑한 사람일지도 모르겠다.


무엇인가 일을 다른 객체에게 시키고, 그 일이 끝나는 것을 기다리는 것이 아니라 그 객체가 나를 다시 부를때까지 내 할일을 하고 있는 것이다.


따라서 Non-Block 이며, 비동기 (Asynchronous) 방식의 함수로 사용된다는 것을 알 수 있다.


node.js 에서 가장 핵심적인 부분이라고 해도 과언이 아니다.


모든 모듈들은, 그리고 코드들은 사용해보았다면 알 수 있었겠지만


함수 속에서 또 다시 function 콜을 한다.


이것들이 다 callback 함수이다. 그렇게 많이 쓰니 콜백 지옥에 빠질수밖에 없다..

사용법


그렇다면 callback 함수는 어떻게 사용하는 것일까 ?


간단한 코드를 들어서 이해해보자.


1
2
3
4
5
6
7
8
plus = function(a, b, callback){
  var result = a+b
  callback(result);
}
 
plus(5,10function(res){
  console.log(res);
})
cs

먼저 plus라는 함수를 선언하고, a와 b와 callback을 받는다.


여기서 callback은 함수 이름이며, 아무거나 해도 상관은 없다.


저런 함수가 정의되었을 때에, 6번 라인에서처럼 5와 10을 집어넣으면 2번 라인으로 가서 5와 10을 더하고,

3번 라인에서 볼 수 있듯이 callback의 첫번째 변수로 result를 넣어서 보낸다.


그렇게되면 아래 6번에서 마지막 인자인 function(res)는 받은 res 값을 출력하는 함수이다.


잘 이해가 안된다면, 다른 코드도 한번 봐보자.


1
2
3
4
5
6
7
8
pm = function(a, b, callback){
  callback(a+b, a-b);
}
 
pm(5,10function(res1, res2){
  console.log(res1);
  console.log(res2);
})
cs


스스로 이해가 된다면 어느정도 알았다고 생각하고 넘어가도 무방하다.


이번 코드를 보면, callback에서 집어 넣는 변수가 두개이다. a+b 와, a-b의 2개이다.


아래 5번 라인에서 function에 들어온 값도 두개이다. res1 과 res2 이다.


따라서 이것을 실행하면 몇이 나오겠는가 ?


답은 

15

-5

식으로 출력이 된다.

왜 중요한가?


만약 콜백인 함수에서 콜백을 사용하지 않게 된다면,


콜백 함수의 과정이 끝나기 전에 다음 프로세스를 진행하게 되는 경우가 있다.


실제로 db에 값을 읽어들일 떄에 한번 경험해 보았는데, 값을 읽기 전에 출력을 해버리기 때문에 


계속 undefined 만 떠서 당황했던 경험이 있다.


내용이 복잡해질수록 callback이 계속되고, 5~6개 심지어는 10단위의 콜백에 갇히는 사람도 있다고 한다.


따라서 구조를 잘 짜서 함수를 짜는것이 중요하겠다 !




댓글 2
  • 프로필사진build good 2016.06.09 00:43

    다른 사람들 적어놓은거 아무리봐도 이해 안됐었는데 양디님 게시물 보고 바로 이해해버렸어요! 감사합니다!

    edit
  • 프로필사진build 보오 2019.12.01 20:00 신고

    너무 명확하고 쉬운 설명.. 감사드립니다 다른 글도 읽으면서 공부해야겠어요

    edit