2011년 5월 24일 화요일

[node.js] 스크립트 언어로써의 node.js

서버사이드 자바스크립트로 잘 알려진 node.js이긴 하지만, 그래도 스크립트 언어다. 약간 변태적이긴 하지만 (-_-) 그렇다면 여타의 python이나 ruby, perl 등의 영역을 침범해 볼 수 있을만한 능력이 있다는 이야기가 된다.

일반적인 유틸리티를 node.js로 만든다면 어떻게 해야 할까.

기본 조건


가장 기본적으로 염두에 두는 건
  • 인자를 읽을 수 있어야 한다.
  • 환경변수를 읽을 수 있어야 한다.
  • 종료 코드를 돌려줄 수 있어야 한다.
의 세 가지다.

위 세 가지는 유틸리티가 실행과 종료 시 꼭 취해야 할 정보와 행동이라고 볼 수 있다. 이런게 안되는 스크립트 언어는 아직 못 본 것 같다. 아마도 node.js도 되리라.

기본 조건의 구현


그렇다면 코드를 구현해보자.
#!/usr/bin/env node

process.argv.forEach(function(val, index, array) {
    console.log('arg #' + index + ': ' + val);
})

console.log('PATH = ' + process.env.PATH);

process.exit(0)
첫 줄에서는 매우 익숙한 인터프리터를 지정하는 부분이다. 파일이름 자체로 실행시킬 때 유용할 것이다.

그런데 '#'으로 시작하는 전통적인 유닉스 쉘 스크립트 스타일이다 보니 주석처리 문법이 다른 JavaScript에서는 오류가 나지 않을까 걱정이 되기도 하는 부분이다.

이 코드를 someutil.js라는 이름으로 저장해서 실행시켜 봤다.
$ node someutil.js test arg 222
arg #0: node
arg #1: /somehome/someuser/someutil.js
arg #2: test
arg #3: arg
arg #4: 222
PATH = /usr/local/bin:/usr/local/sbin/:... (너무 길어서 생략)
다행히도 첫 줄은 오류를 내지 않는다. 이미 예상하고 내부에서 처리해 주는 듯 하다.

process.argv 는 배열로써 프로세스 구동 시 전달된 인자(arguments)를 보관하고 있다. 0번째는 node 자기 자신이 차하고, 1번은 실행스크립트의 절대경로, 그 이후로 각 인자가 들어있다.

즉, 인자 처리는 첫 번째 혹은 두 번째 이후만 처리하면 다른 언어로 쓰던 것과 동일한 순서로 들어온다는 점을 알 수 있다.

process.env는 환경변수를 담고 있다. 여기서는 PATH 환경변수를 출력해 봤는데 잘 나온다.

마지막의 process.exit(0) 는 아주 익숙한 코드일 것이다. exit 혹은 return 등으로 종료 코드를 넘겨주는 부분.

다른 방식의 실행일 경우...


프로세스에 전달된 구동 인자의 첫 번째는 node 라고 이야기 했는데, 만약 node 를 직접 입력해서 실행한 것이 아니라 코드 첫 줄에 지시한 것 처럼 특정 인터프리터로 구동되도록 선언해 놓고 파일 이름 만으로 실행을 시키면 인자는 어떻게 전달될 것인가.
$ chmod a+x someutil.js
$ ./someutil.js test arg 222
arg #0: node
arg #1: /somehome/someuser/someutil.js
arg #2: test
arg #3: arg
arg #4: 222
PATH = /usr/local/bin:/usr/local/sbin/:... (너무 길어서 생략)
동일하다. 당연한 이야기다. 신경 쓸 필요도 없다. ;)

결론


당연하겠지만, node.js는 역시나 서버 분야만이 아니라 다른 여러 분야에서도 사용할 수도 있는 언어다.

하지만 기본적으로 비동기 형식의 API로 인해 순차적으로 일을 처리해야 되는게 많은 유틸리티 분야에서 구현이 쉬울지는 전혀 장담할 수 없다.

다행히도 외부 모듈로 비동기 함수들을 동기 형식으로 순차 실행을 쉽게 할 수도 있으니 아마도 많은 소식이 들리지 않을까.

댓글 없음 :