비동기 프로그래밍

재미삼아 node.js와 javascript를 들여다보는데 비동기 프로그래밍에 대한 이야기가 나와서 재미있게 시간을 보내고 있다.

동기와 비동기라고 하면 동기라고 하면 동시에 뭔가가 이루어지는 것처럼 들리고 비동기라고 하면 뭔가 응답이 올 때마다 동작하는 그런 것이 아닐까 상상이 되는데, 내가 이해했을 때, 동기 프로그래밍은 프로그램의 실행이 프로그램이 씌여진 순서대로 처리되는 것을 가정한 것이고, 비동기 프로그래밍은 이벤트 - 핸들러의 구조로 되어있어서 이벤트가 발생하면 정해진 핸들러를 불러서 작업을 완료시키게 하는 프로그래밍이라고 보여진다.

동기 프로그래밍만 너무 오래해서 그렇게 작성하는 습관이 몸에 베이게 되면 access time긴 장치나 데이터를 다루게 될 때 시스템을 능률적으로 활용하지 못하게 될 수가 있다. 이런 경우엔 runtime library에 맞겨두고 핸들러만 작성하고, 특정 이벤트가 생기면 notification이나 하게 해주면 되는 것이다. 거창하게 비동기이지 사실 사람이 하는 일과 큰 차이가 없다.

이를테면 샤워를 하는 일 자체는 동기 프로그래밍으로 수행하는 일과 같고, 메일을 받아서 그것에 응답하는 일은 비동기 프로그래밍이 수행하는 일과 같다.

문제는 그것을 어떠한 문법으로 표현하는지 이해를 해야하는 것인데, 이게 좀 쉽게 받아들여지지 않는 면이 좀 있다.

이를테면 이렇다.

function a가 있다고 치면

a (arg0, function (arg1, arg2) {});

이런 식의 문법을 쓴다.

그러니까 풀어서 보면 a라는 function을 불렀을 때, 그것이 실행되었을 경우 그 다음에 씌여진 function을 call하는 것이다. 내가 call한 function이 다시 call을 하는 것이니까 callback function이라고 한다.

node.js에서는 생각보다 문법을 크게 다루지 않는다. 몇 가지 예제만 보여주고 끝이다. 사용자가 알아서 사용하는 것이다. 그 얘긴 엄청나게 직관적이라는 건데, 대개 좀 큰 프로젝트들도 사실 제작자 그 자신이 작성하는 것 보단 이미 작성된 수많은 function들을 재활용하는 것이라 다른 module들에 대한 의존도도 매우 높아서, 너무 머리 싸매고 하는 작업이 아니라는 것이 느껴진다.

아무래도 이런 구조와 숨은 문법에 대한 어떤 흐름에 대해 익숙해질 때 까지 시행착오를 한참 해야할 것 같다.