이 글은 http://www.catonmat.net/blog/nodejs-modules-dnode/ 포스팅을 저자에 허락을 얻어 번역한 것입니다. (이후 연재 번역 기사도 동일함)

원문링크 - http://www.catonmat.net/blog/nodejs-modules-dnode/

나는 "node.js modules you should know about"에 대한 연재를 시작할 예정이다. 나는 2년동안 node를 사용하고 있으며, 내가 아는 모든 node 관련 지식을 활용해서 Browserling startup를 만들었다. 나는 또한 약 20개의 node.js 모듈을 작성했다. (my github을 참조해라).

이 연재에서 나는 몇가지 node.js 모듈들과 예제, 그리고 그것들이 어디서 유용한지에 대해서 다룰 것이다.

이 연재의 첫번재 모듈은 dnode다. Dnode는 자유 형태의 rpc 라이브러리로 James Halliday (SubStack) ― Browserling and Testling.의 공동 설립자―가 만들었다.

다음 예제를 통해 dnode에 대해서 살펴보자. 우선 server.js 코드다

var dnode = require('dnode');

var server = dnode({
    mul : function (n, m, cb) { cb(n * m) }
});
server.listen(5050);

그리고 다음은 client.js 코드다.

var dnode = require('dnode');

dnode.connect(5050, function (remote) {
    remote.mul(10, 20, function (n) {
        console.log('10 * 20 = ' + n);
    });
});

이제 client.js 파일을 실행하면, 다음과 같은 결과가 출력된다.

$ node client.js
200

다음 예제를 통해 dnode에 대해서 살펴보자. 우선 server.js 코드다.

dnode의 동작에 대해서 이해할 수 있겠는가? 서버측에 mul 함수는 클라이언트에서 호출되고, 이때 인자 1020이 전달된다. 이 인자들은 서버측에서 곱해진 후, 그 결과값은 cb 를 호출함으로써 다시 클라이언트에게 전달된다.

어떤 코드도 전달되지 않고, 순전히 참조를 통해 이러한 일들이 처리됐다는 것이 중요하다. dnode-protocol github repo.에서 dnode 프로토콜 구현에 대한 자세한 내용을 살펴볼 수 있다.

다음은 좀더 복잡한 예제이다. 클라이언트가 서버를 호출하고, 서버는 다시 클라이언트를 호출하고 그 결과값은 서버로 다시 전달된다. 서버는 그런 다음 클라이언트를 호출하고 결과값을 출력한다.

server.js:

var dnode = require('dnode');

var server = dnode(function (client) {
    this.calculate = function (n, m, cb) {
        client.div(n*m, function (res) {
            cb(res+1)
        });
    }
});
server.listen(5050);

client.js:

var dnode = require('dnode');

var client = dnode({
    div : function (n, cb) {
       cb(n/5);
    }
});

client.connect(5050, function (remote) {
    remote.calculate(10, 20, function (n) {
        console.log('the result is ' + n);
    });
});

클라이언트 코드를 실행하면 결과값은 41이 될 것이다. 무슨 일이 발생했는지 살펴보자. 우선 포트 5050으로 dnode 서버에 연결했다. 연결 후에, dnode 클라이언트는 서버측에 calculate 함수를 호출하고 이때 인자로 1020, 그리고 결과값을 출력할 콜백 함수를 넘겼다.
서버는 인자 1020을 넘겨받아 그것을 곱한 다음, 클라이언트의 div 함수를 호출한다. 이 함수는 결과값을 5로 나눈다. 이 함수의 결과값은 다시 서버로 전달되며, 서버는 이 값에 1을 더해 클라이언트의 원래 콜백 함수를 호출하고, 결과를 출력한다.

우리는 Browserling에 여러 곳에 dnode를 사용했다. 모든 서비스는 dnode 서버로 구성되며 그것들은 서로 연겨로디어 있다. 예를 들어 인증 서비는 dnode 서버다.

dnode 다음 npm 명령을 통해 설치할 있다.

npm install dnode

dnode 아주 설계된 프로토콜이기 때문에, 어느 언어로든 개발이 가능하다. 여기 링크 PerlRubyPHPJava 언어에 대한dnode에 구현 내용을 소개한다.

[역자주 - 이 게시물에 원본에 관심이 있는 분들은 아래 저자의 블로그를 구독하거나, 트위터를 팔로우 해라. 그리고 저자의 Github 사이트에서 생성한 코드를 볼 수 있다.]

If you love these articles, subscribe to my blog for more, follow me on Twitter to find about my adventures, and watch me produce code on GitHub!