[node.js] 스크립트 언어로써의 node.js
서버사이드 자바스크립트로 잘 알려진 node.js이긴 하지만, 그래도 스크립트 언어다. 약간 변태적이긴 하지만 (-_-) 그렇다면 여타의 python이나 ruby, perl 등의 영역을 침범해 볼 수 있을만한 능력이 있다는 이야기가 된다.
일반적인 유틸리티를 node.js로 만든다면 어떻게 해야 할까.
가장 기본적으로 염두에 두는 건
위 세 가지는 유틸리티가 실행과 종료 시 꼭 취해야 할 정보와 행동이라고 볼 수 있다. 이런게 안되는 스크립트 언어는 아직 못 본 것 같다. 아마도 node.js도 되리라.
그렇다면 코드를 구현해보자.
그런데 '#'으로 시작하는 전통적인 유닉스 쉘 스크립트 스타일이다 보니 주석처리 문법이 다른 JavaScript에서는 오류가 나지 않을까 걱정이 되기도 하는 부분이다.
이 코드를
process.argv 는 배열로써 프로세스 구동 시 전달된 인자(arguments)를 보관하고 있다. 0번째는 node 자기 자신이 차하고, 1번은 실행스크립트의 절대경로, 그 이후로 각 인자가 들어있다.
즉, 인자 처리는 첫 번째 혹은 두 번째 이후만 처리하면 다른 언어로 쓰던 것과 동일한 순서로 들어온다는 점을 알 수 있다.
process.env는 환경변수를 담고 있다. 여기서는 PATH 환경변수를 출력해 봤는데 잘 나온다.
마지막의 process.exit(0) 는 아주 익숙한 코드일 것이다. exit 혹은 return 등으로 종료 코드를 넘겨주는 부분.
프로세스에 전달된 구동 인자의 첫 번째는 node 라고 이야기 했는데, 만약 node 를 직접 입력해서 실행한 것이 아니라 코드 첫 줄에 지시한 것 처럼 특정 인터프리터로 구동되도록 선언해 놓고 파일 이름 만으로 실행을 시키면 인자는 어떻게 전달될 것인가.
당연하겠지만, node.js는 역시나 서버 분야만이 아니라 다른 여러 분야에서도 사용할 수도 있는 언어다.
하지만 기본적으로 비동기 형식의 API로 인해 순차적으로 일을 처리해야 되는게 많은 유틸리티 분야에서 구현이 쉬울지는 전혀 장담할 수 없다.
다행히도 외부 모듈로 비동기 함수들을 동기 형식으로 순차 실행을 쉽게 할 수도 있으니 아마도 많은 소식이 들리지 않을까.
일반적인 유틸리티를 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로 인해 순차적으로 일을 처리해야 되는게 많은 유틸리티 분야에서 구현이 쉬울지는 전혀 장담할 수 없다.
다행히도 외부 모듈로 비동기 함수들을 동기 형식으로 순차 실행을 쉽게 할 수도 있으니 아마도 많은 소식이 들리지 않을까.
댓글