98..Etc/node.js2012. 3. 12. 16:46
반응형
이틀간의 삽질을 기념하며 한 번 정리해봅니다.

node.js 설치 정리..

nodejs.org에 들어가서 windows버전의 msi설치파일을 다운로드 받는다.

해당 파일을 설치한다. (설치경로는 default로 c:\Program Files\nodejs\ 이다.)

cmd창을 열어 c:\Program Files\nodejs\ 경로로 이동후 다음을 실행
npm install express 엔터

C:\Program Files\nodejs\node_modules\express 경로에 express가 설치되었고
C:\Program Files\nodejs\node_modules\.bin 경로에 express.cmd 실행파일이 생성되었다.

C:\Program Files\nodejs\node_modules\.bin 경로로 이동 후
express create /nodeExpressSite 엔터

C:\nodeExpressSite 경로에 express용 사이트가 하나 생성되었다.

C:\nodeExpressSite 이동후 다음의 명령실행
node app.js
에러가 난다(필요한 모듈이 없어서..)

C:\nodeExpressSite 디렉토리에 들어가서 다음의 명령 실행
npm install -d

C:\nodeExpressSite 디렉토리에 필요한 모듈들이 자동으로 설치된다.

다시 다음의 명령 실행
node app.js
3000포트에 개발모드로 서버가 리스닝 하고 있다는 메시지가 나온다.

브라우저를 열어서 http://localhost:3000 로 접속해본다.
Welcome to Express라는 메시지가 뜬다.

이제부터 express 공부시작.. 화이팅~

도움을 받은 곳
kenu형의 동영상강좌
https://github.com/visionmedia/express 설명
http://firejune.io/express/ firejune님의 express번역사이트



출처 : http://okjsp.pe.kr/seq/184404
Posted by 1010
98..Etc/node.js2012. 3. 12. 16:24
반응형

이 포스팅은 node.js는 무엇인가? #1에 이어진 포스팅입니다.



Hello World에 대한 예제는 여러가지가 있지만 아무래도 node.js를 만든 Ryan Dahl가 보여준 예제가 node.js를 가장 잘 표현해 주는것 같아서 Ryan Dahl가 JSConf에 사용한 Hello World 예제를 그대로 사용하였습니다. nettuse+의 Learning Server-Side JavaScript with Node.js 에 나온 소스도 참고하시면 도움이 될 듯 합니다.



Node.js 설치하기
Node.js는 Mac OS X, Linux, FreeBSD같은 Unix기반의 시스템에서만 구동됩니다. (최근 Windows쪽에서도 할 수잇다느 포스팅을 본적이 있는것 같은데 지금은 찾을 수 없네요.) Node.js v0.6.x부터는 Windows에서도 동작합니다.

node.js를 다운로드 받습니다. node.js 공식사이트에서 최신 릴리즈버전을 다운로드 를 받을 수 있으며 현재 버전은 0.1.97입니다. 다운로드 받은 파일을 원하는 위치에 압축을 풀면 됩니다. Node.js는 GITHUB 에서 저장소를 사용하고 있기 때문에 GIT을 이용해서 git clone http://github.com/ry/node.git 명령어을 사용하면 현재 개발중인 최신소스를 받아서 테스트 해 볼 수 있습니다.

node.js가 소스가 있는 폴더로 이동하여 다음과 같은 명령어를 실행합니다.
./configure
make
sudo make install

설치할때 각 라이브러리를 체크하는데 단순히 현재 시스템에 지원여부를 체크하는 것이므로 not found라고 나와도 문제가 있는 것이 아니므로 신경쓰지 않아도 됩니다. (./configure를 하지 않으면 Project not configured 오류가 발생합니다.)

Node.js를 실행하기 위해서는 Node.js의 node명령어를 사용해야 하기 때문에 환경변수 path에 node.js가 설치된 경로(/Users/Outsider/node 같은)를 추가하면 아무데서나 node명령어를 사용할 수 있습니다.(우분투에서는 sudo gedit /etc/environment로 OSX는 sudo vi /etc/paths를 사용해서 PATH를 수정해 볼 수 있습니다. 수정된 PATH는 재로그인 후에 적용이 되며 env나 echo $PATH를 사용해서 확인할 수 있습니다.) V8은 내장되어 있고 별도의 의존성이 전혀 없기 때문에 설치하고 바로 사용할 수 있습니다.



Hello World 실행하기
아래의 예제들은 Node.js 0.1.96버전을 사용하였습니다. Ryan Dahl가 시연했던 코드와는 API가 변경된 내용이 많기 때문에 아래의 예제들은 0.1.96버전에서 동작하도록 수정하였습니다.
1
2
3
4
5
6
// helloworld1.js
var sys = require("sys")
setTimeout(function() {
sys.puts("world");
}, 2000);
sys.puts("hello");

Hello World 예제입니다.

node helloworld1.js

위의 명령어를 실행하면 node.js가 실행됩니다. Node.js는 더이상 할일이 없으면 자동으로 종료됩니다.

Hello World 실행화면



Hello World 실행하기2
1
2
3
4
5
6
7
8
9
10
puts = require("sys").puts;
setInterval(function() {
puts("hello");
}, 500);
process.addListener("SIGINT", function() {
puts("good-bye");
process.exit(0);
});

Hello World 실행화면

두번째 예제입니다. setIntervla을 이용해서 hello라는 메시지를 0.5초마다 계속 반복적으로 출력해 주고 종료명령인 Ctrl + C를 입력하면 good-bye라는 메시지를 출력한 후에 종료해줍니다. process는 V8 그 자체를 의미합니다. process에 SIGINT라는 이벤트리스너를 추가하여 해당시그널이 왔을때 이벤트가 발생하게 됩니다.



TCP 서버 예제
1
2
3
4
5
6
7
8
9
var tcp = require("net");
var s = tcp.createServer();
s.addListener("connection", function(c) {
c.write("hello!");
c.end();
});
s.listen(8000);

TCP 서버 예제입니다. 1번라인의 tcp는 현재 버전에서 net으로 변경되었으며 5번라인의 send()는 write()로, 6번라인의 close()는 end()로 변경되었기 때문에 현재 버전에 맞게 수정되었습니다.

TCP 서버 실행화면

위 화면에서 뒷쪽의 터미널에서 TCP서버를 실행시켜두고 터미널을 새로 띄워서 localhost에 TCP서버에 접속한 것입니다. 작성해 놓은대로 hello!를 출력한 뒤에 접속을 종료합니다. 9번 라인에서 TCP서버는 8000포트를 이용하도록 설정되어 있습니다. net객체는 접속이 들어올때마다 connection이벤트를 발생시키며 HTTP 업로드가 될때 각 패킷마다 body 이벤트가 호출됩니다.

사용자 삽입 이미지

아직 완전히 API가 Fix되지 않았기 때문에 버전에 따라서 변경되는 내용들이 있는 상황입니다. 일일이 다 테스트 해 본것은 아니지만 버전에 따라 변경되는 내용이 존재하고 있고 바로바로 문서에 반영되는 것은 아니기 때문에 상황에 따라서는 소스를 직접 열어보아야 하는 상황입니다만 위의 화면처럼 현재버전의 require("sys")대신 구버전에서 사용하던 require("tcp")를 사용할 경우 'tcp'가 'net'으로 변경되었다고 친절하게 알려줍니다.

connection리스너는 createServer의 첫번째 아규먼트로 사용할 수 있기 때문에 위의 코드는 아래처럼 변경할 수 있습니다.
1
2
3
4
5
6
var tcp = require("net");
tcp.createServer(function(c) {
c.write("hello!\n");
c.end();
}).listen(8000);




Simple HTTP 서버 예제
1
2
3
4
5
6
7
8
var http = require("http");
http.createServer(function(req, res) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("Hello\r\n");
res.write("World\r\n");
res.end();
}).listen(8080);


Simple HTTP서버 실행화면

웹브라우저에서 접속하면 서버에서 작성한대로 Hello world가 정상적으로 출력됩니다.



스트리밍 서버 예제
1
2
3
4
5
6
7
8
9
10
11
12
var http = require("http");
http.createServer(function(req, res) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("Hel");
res.write("lo\r\n");
setTimeout(function() {
res.write("World\r\n");
res.end();
}, 2000);
}).listen(8000);


스트리밍서버 실행화면

웹브라우저에서는 스트림을 비동기로 받아지지 않아서 curl 을 사용해서 테스트하였습니다. 접속하면 Hello가 바로 찍힌뒤 setTimeout으로 설정한대로 2초뒤에 World가 출력되고 접속이 종료됩니다.



node.js의 시스템 접근 예제
1
2
3
4
5
6
7
8
var sys = require("sys"),
spawn = require("child_process").spawn;
var ls = spawn("ls", ["-ls", "/"]);
ls.stdout.addListener("data", function(data) {
sys.print(data);
});

사용자 삽입 이미지

위 예제는 시스템에 접근하는 예제입니다. ls -ls /을 실행하여 그 결과를 출력하여줍니다. Node.js는 앞에서도 언급했든이 버퍼링을 강제하지 않습니다. data를 child process의 STDIO를 통해서 스트림하도록 저레벨의 기능(facility)을 사용합니다. (Simple IPC 예제는 chile process의 방법이 완전히 바뀐것 같은데 어떻게 똑같은 예제를 만들어야 할지 전혀 모르겠더군요. ㅠㅠ)



Epilogue
간단히 헬로월드만 따라해보고는 Node.js를 감히 판단할 수는 없겠지만 Node.js가 보여주는 미래는 놀랍습니다. 이벤트드리븐을 이용해서 서버의 퍼포먼스를 엄청나게 끌어들일 수 있으면 현재 프론트앤드 개발자가 가지고 있는 Javascript 스킬을 그대로 사용해서 자신이 원하는 웹서버를 직접 만들어 낼 수 있습니다. 엔터프라이즈급의 서버까지 만들어 낼 수 있을지는 아직 판단하기 어렵지만 정해진 일정기능의 서버는 아주 간단하게 충분한 퍼포먼스를 가지고 만들어 낼 수 있을 듯 합니다. 현재 버전이 0.2도 가지 않은 상황에서 수많은 모듈들 이 개발되고 있는 것으로 보아도 그 미래가 상당히 기대가 됩니다. 아마 올해 node.js를 많이 만지게 될것 같습니다.


출처 : http://blog.outsider.ne.kr/481
Posted by 1010
98..Etc/node.js2012. 3. 12. 16:21
반응형

'node.js 따라배우기'에 해당되는 글 24건
Posted by 1010
98..Etc/node.js2012. 3. 10. 12:26
반응형

최근들어 node.js가 화제가 되고 있다. 계속 이어지고 있다고 해야되나. 새로운 관련 모듈이나 프레임웍이 나올 때 마다 찬양 일색이다. 도데체 뭐길래 그렇게 뜨고 있는 걸까.

딱히 할 일도 없고 해서 (- _ -) 한번 설치해서 뭔가를 돌려봤다.

설치


http://nodejs.org/

여기서 Download메뉴를 통해 타르볼을 받거나 저장소 소스를 긁어서 빌드하면 되는 듯. 공식사이트가 깔끔한게 너무 마음에 든다.

맥포트에 있나 싶어 검색해 봤더니 역시나 있다.
sudo port install nodejs

돌려보기


공식 홈페이지에 가장 첫 예제코드. 전통적으로 첫 코드 답게 Hello World를 찍어주는 서버를 만드는 코드다.
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'ContentType': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at 127.0.0.1:1337/');
실행도 시켜 보고...
node example.js
웹브라우저로 http://127.0.0.1:1337/ 로 접속해 보니 잘 돌아간다.
별 다른 프레임웍 없이 이 정도까지 간단하게 된다는 건 칭찬해 줄 만 하다.

그래서 뭐 대단한 거 있나?


node.js의 이름에서 .js라는 명칭은 javascript를 연상시키는 이름. 딱 맞다. 'V8 JavaScript 언어를 기반으로 만들어진 모듈 및 프레임웍 덩어리' 라는게 node.js를 설명하는 가장 간단한 용어 같다.

node.js가 뜬 이유는 웹 서버를 구축하는데 비동기(asynchronous) 구조를 가지게 하는게 가장 큰 특징이었는데, 알고보면 그다지 대단한게 아니다. 비동기 모델은 예전부터 이미 사용되고 있었다. (특히 POSIX의 select 시스템을 안다면 -_-). 세월이 흐르면서 코드 디자인 상으로 볼 때 동기(synchronous) 모델에 비해 코드가 직관적이지 않다는 단점이 있어서 오히려 멀티스레드를 이용한 동기화 모델이 크게 발달하게 되었는데... 이제는 비동기 모델을 띄워주고 있다.

node.js의 홈페이지 에서도 설명하고 있지만 비동기 모델이 가지는 장점은 코드의 가독성과는 전혀 딴판인 이야기다. 멀티스레드 혹은 멀티프로세스의 전통적인 서버 구조에 비해 비동기형 이벤트 기반의 시스템이 가지는 이점 말이다. 설명할 것도 없다. 빠르다는 것이지. 이벤트가 없으면 서버가 아예 sleep 상태가 되니 서버가 편해지겠구나. ;;

웹소켓이니 뭐니 일단 좋아보이는 기술을 사용할 수 있다는 것도 장점이긴 하겠지만 기존 request and receive 기반 구조와 차이가 있는건 아니니 아키텍쳐 면에서는 대단한 신기술은 전혀 발견할 수 없다.

그냥 JavaScript 언어 기반이라는게 뜨게 된 가장 큰 원인이 아닐까. 내 주관적으로 꼽자면, 비동기 모델을 아주 쉽고 간편하게 만들 수 있다는 게 가장 큰 의의인 것 같지만...


출처 : http://seorenn.blogspot.com/2011/05/nodejs.html
Posted by 1010
98..Etc/node.js2012. 3. 10. 12:23
반응형


IBM dW기사로 나온 node.js에 대한 기사입니다. 사실 훨씬더 일찍 나왔어야 하는 기사입니다. 왜냐하면 우리나라 분위기와는 달리 외국에서는 node.js에 대한 이야기가 훨씬 더 북적북적 많이 되고 있는 상황입니다. 2010년에 이어서 2011년에 주목해야 하는 기술을 뽑는다면 TOP3에 들어갈만한 기술일 겁니다.

구글 크롬은 구글에서 만든 브라우저라는 걸로 유명하지만, 그 내부적으로는 v8이라 불리는 고성능 자바스크립트 엔진의 출현이 더 많은 엔지니어들에게 충격을 줍니다. 나름 꽤 빠르다던 firefox 진형은 깜놀해서 자신의 엔진을 새롭게 개발하게 되었고, IE는 좀 더 심하게 조롱을 당하면서 마찬가지로 MS의 엔지니어들을 분발시켰습니다.

이와는 별개로 v8 javascript engine이 자바스크립트를 고속으로 해석해낸다는 점 + javascript의 functional language로써의 특징과 자바스크립트 고유의 이벤트 기반의 동작방식을 응용해서 서버프로그래밍 프레임워크가 나옵니다. 그게 바로 node.js입니다.

언제나 그렇듯 IBM 기사의 내용은 앞 부분이 훅~ 빠져있기때문에 잘 이해하기 위해서는 선행 학습이 필요합니다.

몇 가지 추천 링크를 적어보면 이렇습니다.

outsider님의 블로그 (한글이좋죠~ : )
node.js는 무엇인가? #1
node.js는 무엇인가? #2

node.js 공식사이트 (뭐든 공식사이트는 기본이죠~)
http://nodejs.org/

따라하기식으로 배우는 node.js 튜터리얼
http://dailyjs.com/tags.html#lmawa
굉장히 쉽게 잘 되어 있고 ,밑에 달린 코멘트들의 질답도 읽어볼만 합니다. 더불어 관련 프레임워크들도 배우게 됩니다.

사실 node.js가 뜨게 된데는 그 성능상의 놀라움 때문이 큰데요, 한때는 이벤트 기반의 non-blocking I/O 서버인 nginx와의 성능대결도 화제이곤 했습니다만, 지금은 node.js를 nginx와 mixin 해서 함께 사용하기도 하는군요.


효율을 높이기 위해 static 파일등의 front-end 처리와 proxy 기능은 nginx가 처리하고 애플리케이션 기능을 node.js가 처리하는 방식입니다. 이런 방식의 절대적인 효용에 대해서는 아직은 조금 더 지켜봐야 하는 것 같습니다만 다양한 시도는 좋은 것 같습니다. : )


출처 : http://blog.doortts.com/189
Posted by 1010
98..Etc/node.js2012. 3. 10. 12:22
반응형

소개

Node에 대해 들어본 적이 있거나 node가 얼마나 대단한지 주장하는 기사를 읽어본 적이 있다면 "대체 Node.js가 무엇인가?"라고 궁금해할 수 있다. Node의 자체 홈 페이지를 읽은 후에도 Node가 무엇인지에 대해 여전히 의문을 가질 수도 있다. Node는 분명히 모든 프로그래머에게 맞는 것은 아니지만, 일부에게는 올바른 선택이 될 수도 있다.

이 기사는 Node.js가 해결하는 문제의 간단한 배경지식을 제공하여 Node. js가 무엇이고 어떻게 작업하며 간단한 애플리케이션을 실행하는 방법과 마지막으로 어디에서 Node가 훌륭한 솔루션인지에 대해 응답을 찾을 것이다. 이 기사는 복잡한 Node 애플리케이션을 쓰는 방법을 다루거나 Node에 대한 완전한 튜토리얼이 되지는 않을 것이다. 독자가 이 기사를 읽으면 자체적인 비즈니스에서 Node 학습을 더 심도있게 추구해야 하는지 여부를 결정하는 데 도움이 될 것이다.


Node가 어떤 문제를 해결하는가?

Node의 명시된 최우선 순위의 목표는 "확장 가능한 네트워크 프로그램을 빌드하기 위해 간편한 방법을 제공하는 것"이다. 현재 서버 프로그램의 문제는 무엇인가? 계산을 해보자. Java™ 및 PHP와 같은 언어에서 각 연결은 이와 함께 잠재적으로 수반하는 2MB 메모리가 있는 새 스레드를 생성한다. 8GB RAM을 갖춘 시스템에서 동시적 연결의 이론적인 최대 숫자로 약 4000명의 사용자를 연결시킨다. 클라이언트 기반이 성장하면서, 더 많은 사용자를 지원하는 웹 애플리케이션을 원했다면 점점 더 서버를 추가해야 했다. 물론, 이는 비즈니스의 서버 비용, 트래픽 비용, 인건비 및 기타 등등에 더해진다. 이러한 비용을 더하는 것은 잠재적인 기술 문제이다 — 사용자는 각 요청에 대해 다른 서버를 사용할 수 있으므로, 어느 공유 자원이나 모든 서버에 걸쳐서 공유되어야 한다. 이러한 모든 이유로 인해, 전체 웹 애플리케이션 아키텍처(트래픽 처리량, 프로세서 속도 및 메모리 속도 포함)에서 병목은 서버가 처리할 수 있는 동시 연결의 최대 숫자였다.

Node는 연결이 서버로 설정되는 방법을 변경하여 이 문제를 해결한다. 각 연결에 대해 새 OS 스레드를 생성하는(그리고 이와 수반하는 메모리를 할당하고) 대신에 각 연결은 Node 엔진의 프로세스 내에서 이벤트 실행을 촉발한다. Node는 허용된 잠금이 없고 I/O 호출에 대해 직접 차단하지 않기 때문에 교착 상태가 절대 없다고 주장한다. Node는 수 만개의 동시 연결을 지원할 수 있는 서버 실행을 주장한다.

그러므로 수 만개의 동시 연결을 처리할 수 있는 프로그램이 있으므로 Node로 실제로 무엇을 빌드할 수 있는가? 이 많은 연결에 필요한 웹 애플리케이션이 있다면 멋질 것이다. 이는 "이 문제가 있다면 문제가 아니다" 종류의 문제 중 하나이다. 이를 다루기 전에 Node가 어떻게 작업하는지 그리고 실행하도록 어떻게 설계되는지에 대해 살펴보자.


Node가 절대 아닌 것

그렇다. Node는 서버 문제이다. 하지만, 기본 Node 제품은 Apache 또는 Tomcat과 절대 같지 않다. 이러한 서버는 기본적으로 설치 준비된(ready-to-install) 서버 제품이고 앱을 즉시 배치할 준비가 되었다. 이러한 제품으로 바로 서버를 켜고 실행할 수 있다. Node는 절대 이러한 것은 아니다. Apache가 개발자들이 동적 웹 페이지를 작성하도록 허용하기 위해 PHP 모듈을 추가하고 안전한 연결을 위해 SSL 모듈을 추가할 수 있는 방법과 마찬가지로 Node는 Node 핵심에도 추가될 수 있는 모듈의 개념이 있다. Node로부터 선택하는 모듈은 그야말로 수 백 가지가 있고, 커뮤니티는 매일 많은 모듈을 제작하고 게시하며 업데이트하는 데 매우 활동적이다. 이 기사의 이후 부분에서 Node의 전체 모듈 부분에 대해 논의할 것이다.


Node가 작동하는 방법

Node는 그 자체로 V8 JavaScript를 실행한다. 잠깐, 뭐라고 했는가? 서버에서 JavaScript란 말인가? 그렇다. 독자가 제대로 읽었다. 서버측 JavaScript는 클라이언트에서 JavaScript로 독점적으로 작업한 모든 사람들에게 새로운 개념이 될 수 있지만, 그 생각 자체는 너무 멀리에서 도입한 것은 아니다 — 서버에서 사용하는 클라이언트의 동일한 프로그래밍 언어를 왜 사용하지 않는가?

V8은 무엇인가? V8 JavaScript 엔진은 Google이 Chrome 브라우저로 사용하는 내재된 JavaScript 엔진이다. 적은 수의 사람들이 클라이언트에서 JavaScript로 실제로 무엇이 발생하는지에 대해 생각한다. JavaScript 엔진은 실제로 코드를 해석하고 실행한다. V8을 통해 Google은 또 다른 고유한 측면으로 C++로 쓰여진 초고속 해석기를 제작했다. 이 엔진을 다운로드하고 원하는 어느 애플리케이션에나 임베드할 수 있다. 이는 브라우저에서 실행하도록 제한되지 않는다. 그러므로, Node는 실제로 Google이 쓴 V8 JavaScript 엔진을 사용하고 서버에서 사용하도록 용도를 변경한다. 완벽하다! 이미 훌륭한 솔루션이 사용 가능할 때 새로운 언어를 작성할 이유는 없다.

이벤트 구동형 프로그래밍

많은 프로그래머들은 오브젝트 지향 프로그래밍이 완벽한 프로그래밍 설계라고 생각하고 다른 것을 사용하지 않도록 교육받았다. Node는 이벤트 구동형 프로그래밍 모델이라는 것을 활용한다.


목록 1. jQuery로 클라이언트측에서 이벤트 구동형 프로그래밍
				
// jQuery code on the client-side showing how Event-Driven programming works

// When a button is pressed, an Event occurs - deal with it
// directly right here in an anonymous function, where all the
// necessary variables are present and can be referenced directly
$("#myButton").click(function(){
     if ($("#myTextField").val() != $(this).val())
         alert("Field must match button text");
});

서버측은 실제로 클라이언트측과 다르지 않다. 사실이다. 눌러야 하는 단추도 없고 입력하는 텍스트 필드도 없지만, 더 상위 레벨에서 이벤트가 진행 중이다. 하나의 연결이 작성되었다 — 이벤트이다! 데이터가 연결을 통해 수신된다 — 이벤트이다! 데이터가 연결을 통해 오는 것이 중지된다 — 이벤트이다!

이러한 유형의 설정이 Node에 이상적인 이유는 무엇인가? JavaScript는 익명의 함수와 클로저를 허용하고, 그리고 더 중요하게도 구문이 코드를 해 본 적이 있는 거의 모든 사람에게 익숙하므로 이벤트 구동형 프로그래밍에 훌륭한 언어이다. 이벤트가 발생할 때 호출되는 콜백 함수는 이벤트를 캡처하는 동일한 지점에서 쓰여질 수 있다. 코드하기에 간편하고 유지보수하기에도 간편하다. 복잡한 오브젝트 지향 프레임워크가 없고, 인터페이스도 없으며, 과도한 아키텍팅(over-architecting)이 없다. 이벤트를 청취하고 콜백 함수를 쓰기만 하면 모든 것이 처리된다!


예제 Node 애플리케이션

마침내 일부 코드를 살펴보자! 논의한 모든 것들을 한데 묶어서 첫 번째 Node 애플리케이션을 작성해보자. Node가 높은 트래픽 애플리케이션을 처리하는 데 이상적이라는 것을 확인했으므로 최대 속도를 위해 제작된 매우 간단한 웹 애플리케이션을 작성해보자. "상사"로부터 아래로 전달된 샘플 애플리케이션에 대한 스펙이 여기 나와 있다. 무작위 숫자 생성기 RESTful API를 작성한다. 애플리케이션은 하나의 입력, "숫자"라는 하나의 매개변수를 취해야 한다. 그러면 해당 애플리케이션은 0과 이 매개변수 사이의 무작위 숫자를 리턴하고, 생성된 숫자를 호출자에게 리턴할 것이다. 그리고, "상사"가 엄청나게 인기 있는 애플리케이션이 되도록 기대하고 있으므로 이는 50000명의 동시 사용자를 처리해야 한다. 다음 코드를 살펴보자.


목록 2. Node 무작위 숫자 생성기
				
// these modules need to be imported in order to use them.
// Node has several modules.  They are like any #include
// or import statement in other languages
var http = require("http");
var url = require("url");

// The most important line in any Node file.  This function
// does the actual process of creating the server.  Technically,
// Node tells the underlying operating system that whenever a
// connection is made, this particular callback function should be
// executed.  Since we're creating a web service with REST API,
// we want an HTTP server, which requires the http variable
// we created in the lines above.
// Finally, you can see that the callback method receives a 'request'
// and 'response' object automatically.  This should be familiar
// to any PHP or Java programmer.
http.createServer(function(request, response) {

     // The response needs to handle all the headers, and the return codes
     // These types of things are handled automatically in server programs
     // like Apache and Tomcat, but Node requires everything to be done yourself
     response.writeHead(200, {"Content-Type": "text/plain"});

     // Here is some unique-looking code.  This is how Node retrives
     // parameters passed in from client requests.  The url module
     // handles all these functions.  The parse function
     // deconstructs the URL, and places the query key-values in the
     // query object.  We can find the value for the "number" key
     // by referencing it directly - the beauty of JavaScript.
     var params = url.parse(request.url, true).query;
     var input = params.number;

     // These are the generic JavaScript methods that will create
     // our random number that gets passed back to the caller
     var numInput = new Number(input);
     var numOutput = new Number(Math.random() * numInput).toFixed(0);
     
     // Write the random number to response
     response.write(numOutput);
     
     // Node requires us to explicitly end this connection.  This is because
     // Node allows you to keep a connection open and pass data back and forth,
     // though that advanced topic isn't discussed in this article.
     response.end();

   // When we create the server, we have to explicitly connect the HTTP server to
   // a port.  Standard HTTP port is 80, so we'll connect it to that one.
}).listen(80);

// Output a String to the console once the server starts up, letting us know everything
// starts up correctly
console.log("Random Number Generator Running...");

이 애플리케이션 시작하기

"random.js"라는 파일로 위의 코드를 넣는다. 이제 이 애플리케이션을 시작하여 실행하기 위해(그러므로 HTTP 서버를 작성하고 포트 80에서 연결을 청취함) 명령 프롬프트에서 다음 명령을 간단히 실행한다. % node random.js 서버를 시작하여 실행하는 중임을 인식할 때 다음과 같이 표시될 것이다.

root@ubuntu:/home/moila/ws/mike# node random.js
Random Number Generator Running...

이 애플리케이션에 액세스하기

애플리케이션이 시작되어 실행 중이다. Node가 현재 어느 연결이나 청취하고 있으므로 애플리케이션을 테스트해보자. 간단한 RESTful API를 작성했으므로, 웹 브라우저를 사용하여 애플리케이션에 액세스할 수 있다. 다음 주소를 입력하자(이전 단계를 완료하도록 한다). http://localhost/?number=27

브라우저 창이 0과 27사이의 무작위 숫자로 변경될 것이다. 브라우저에서 다시 로드하기를 누르면 또 다른 무작위 숫자가 나타날 것이다. 이렇게만 하면 된다. 첫 번째 Node 애플리케이션이 나왔다.


Node가 무엇에 유용한가?

자, Node에 대해 모두 읽고 나서 "Node란 무엇인가?"라는 질문에 응답할 수 있지만, "Node를 무엇에 대해 사용해야 하는가?"라는 의문을 가질 수 있다. Node가 정말로 유용한 것이 있기 때문에 이는 물어볼 만한 중요한 질문이다.

유용한 것

지금까지 살펴본 것처럼 Node는 대량의 트래픽과 서버측 논리를 예상하는 상황에 극도로 우수하게 설계되었고, 필요한 처리는 클라이언트에 응답하기 전에 반드시 규모가 클 필요는 없다. 여기에 Node가 탁월한 훌륭한 예제가 나와 있다.

  • RESTful API

    RESTful API를 제공하는 웹 서비스는 몇 가지 매개변수에서 취하고 이를 해석하여 응답과 함께 묶고 응답(대개 상대적으로 적은 양의 텍스트)을 사용자에게 다시 보낸다. 이는 Node에 이상적인 상황이다. 왜냐하면 이는 수 만개의 연결을 처리하도록 제작될 수 있기 때문이다. 이는 또한 대용량의 논리를 요구하지 않고, 기본적으로 데이터베이스로부터 값을 찾아 응답과 함께 종합한다. 응답이 소규모의 텍스트이므로, 수신 요청은 소규모의 텍스트이고, 트래픽 볼륨은 높지 않고, 하나의 머신이 가장 바쁜 회사의 API의 API 요청조차 처리할 가능성이 높다.

  • Twitter 큐

    트윗을 수신하고 데이터베이스로 이를 써야 하는 Twitter와 같은 회사에 대해 생각해 보자. 그야말로 초당 수 천개의 트윗이 들어오고 데이터베이스는 최대 사용 시간 동안 필요한 쓰기의 수를 거의 유지할 수 없다. Node는 이러한 문제점에 솔루션에서 중요한 구성요소가 된다. 확인한 대로 Node는 수 만개의 수신 트윗을 처리할 수 있다. 그러면 이는 인메모리 큐잉 메커니즘(예를 들어, memcached)으로 이를 빠르고 간편하게 쓸 수 있으며, 여기에서부터 또 다른 별도의 프로세스가 해당 데이터베이스로 이를 쓸 수 있다. 여기에서 Node의 역할은 트윗을 빠르게 수집하고 정보를 쓸 책임이 있는 다른 프로세스로 전달하는 것이다. 또 다른 설계를 상상해보자 — DB 자체로 쓰기를 처리하기 위해 노력하는 정상 PHP 서버 — 모든 트윗은 DB 호출이 차단되었으므로 DB에 쓰인 대로 약간의 지연이 발생할 것이다. 이러한 설계를 갖춘 머신은 데이터베이스 대기 시간으로 인해 초당 2000개의 수신 트윗만 처리할 수 있다. 초당 백 만개의 트윗이고 500개의 서버를 말하는 것이다. 그 대신에 Node는 모든 연결을 처리하고 차단하지 않아 이에 발생할 수 있는 가능한 많은 트윗을 캡처하기 위해 사용한다. 한 개의 노드 머신은 초당 50000개의 트윗을 처리할 수 있으며, 20개의 서버만 말하는 것이다.

  • 비디오 게임 통계

    Call of Duty 온라인과 같은 게임을 해본 적이 있다면, 게임 통계를 살펴볼 때 주로 통계의 레벨을 제작하기 위해 게임에 대해 엄청난 정보를 추적해야 한다는 생각이 즉시 떠오른다. 그러면 어느 시점에나 게임을 하는 수 백만의 사람들을 고려하면, 매우 빠르게 생성되는 수많은 정보가 있음을 깨닫는다. 게임으로부터 생성되는 데이터를 캡처할 수 있고, 이에 통합의 최소량을 수행한 다음에 데이터베이스로 쓰기 위해 이를 큐할 수 있기 때문에 Node는 이 시나리오에 대해 훌륭한 솔루션이다. 게임에서 사람들이 얼마나 많은 총알을 발사하는지 추적하는 데 전체 서버가 전념하는 것은 우스워 보일 수 있다. 이는 Apache와 같은 서버를 사용한 경우에 유용한 한계가 될 수 있지만 Node를 실행 중인 서버로 작업할 수 있는 것과 같이 게임에서부터 거의 모든 통계를 추적하는 데 하나의 서버가 전념할 수 있었다면 덜 우스워 보일 것이다.


Node 모듈

이 기사에서 원래는 계획된 논의가 아니었지만 대중적인 요청으로 인해 Node Modules과 Node Package Manager의 간략한 소개를 포함하도록 늘렸다. Apache로 작업하는 것에 익숙해지면서 성장한 사람들처럼 독자는 모듈을 설치하여 Node의 기능을 확장할 수 있다. 하지만, Node로 사용할 수 있는 모듈이 해당 제품을 엄청나게 향상시키기 때문에, 누구나 몇 가지 모듈을 설치하지 않고 Node를 사용할 가능성은 낮다. 이는 모듈이 전체 제품의 필수적인 부분이 되기까지 훌륭해진 이유이다.

참고자료에서 필자는 모듈 페이지로 링크를 제공하며, 여기에 모든 가능한 모듈이 나열되고 다운로드 가능하다. 기회를 빠르게 추출하기 위해 이는 사용 가능한 수많은 모듈 가운데 동적으로 작성된 페이지(PHP 등)를 쓰기 위한 모듈, MySQL로 간편하게 작업하기 위한 모듈, WebSockets를 돕기 위한 모듈 및 텍스트와 매개변수 구문 분석을 지원하기 위한 모듈을 포함한다. 필자는 모듈의 세부사항을 다루지 않을 것이다. 다시 말하지만, 이 기사는 Node를 심화하여 추구해야 할 만한 것인지 이해하는 데 도움을 주는 개요 기사에 불과하기 때문에, 독자가 이를 심도있게 알아보려고 선택하는 경우 당연히 사용 가능한 모듈로 작업해야 할 것이다.

추가적으로, Node는 Node Package Module을 갖추고 있으며, 이는 사용 중인 Node 모듈을 설치하고 관리하는 내장형 방식이다. 이는 자동으로 종속 항목을 처리하므로 설치하려는 어느 모듈이나 모든 필수 조각으로 제대로 설치하는 것이 보장될 수 있다. 자체적인 모듈에 관여하여 쓰려고 선택하는 경우 이는 Node 커뮤니티로 자체적인 모듈을 게시하는 방법으로서 역할을 담당한다. Node 설치를 중단하는 것에 대해 걱정하지 않고 Node의 기능을 간편하게 확장하는 방법으로서 NPM을 고려해보자. 다시 말하지만, Node를 심도있게 추구하기 위해 선택하는 경우 NPM은 Node 솔루션의 필수적 부분이 될 것이다.


결론

편집자의 참고

이 기사의 초기 발표된 버전으로 인해 이 기사가 표현한 다양한 관점에 대해 커뮤니티에서 많은 논의가 생성되었다. 그 이후로 작성자는 이러한 생각을 염두에 두고 이 기사를 개정했다. 이러한 종류의 동료 검토와 논의는 오프 소스 영역의 필수적인 부분이다. 건설적인 조언을 제공한 사람들한테 감사한다.

모든 오픈 소스 프로젝트와 마찬가지로 Node.js는 계속 진화할 것이고 개발자들은 한계의 숫자를 막론하고 이를 극복하기 위해 새로운 자원과 기술을 발견할 것이다. 언제나처럼 독자들이 스스로를 위해 기술을 시도해 보기 바란다.

"Node.js란?"이라는 이 기사의 초반부에서 독자가 가졌던 많은 의문들에 대해 이 기사를 읽은 후에 독자 스스로 모두 답할 수 있어야 한다. 독자는 Node.js가 무엇인지에 대해 몇 가지 분명하고 간결한 문장으로 설명할 수 있어야 한다. 그렇게 수행할 수 있다면, 거의 다른 모든 프로그래머들보다 앞서는 것이다. Node에 대해 필자와 대화했던 많은 사람들이 Node가 정확하게 수행하는 내용에 대해 혼란스러워했다. 당연히 이들은 Apache 사고방식을 가지고 있다 —서버가 HTML 파일을 놓는 애플리케이션이고 모두 작동한다는 것이다. 대부분의 프로그래머가 Apache와 Apache가 작업하는 것에 익숙하기 때문에, Node를 설명하는 가장 간편한 방법은 Apache와 비교하는 것이다. Node는 Apache가 할 수 있는 어느 작업이나 할 수 있는(일부 모듈을 사용하여) 프로그램이지만, 빌드할 수 있는 확장 가능한 JavaScript 플랫폼이 되어 훨씬 더 많은 작업을 할 수도 있다.

이 기사에서 Node가 고도로 확장 가능한 서버를 제공하는 목표를 달성하는 방법을 확인했다. 이는 Google, V8 엔진으로부터 엄청나게 빠른 JavaScript 엔진을 사용한다. 이는 코드를 최소화하고 읽기 간편하게 유지하도록 이벤트 구동형 설계를 사용한다. 이러한 모든 요인들로 인해 Node가 원하는 목표를 만들어낸다 — 이는 엄청나게 확장 가능한 솔루션을 쓰기에 상대적으로 간편하다.

Node가 무엇인지에 대해 이해하는 것이 중요한 것처럼 무엇이 아닌지에 대해 이해하는 것도 중요하다. Node는 즉시 PHP 웹 애플리케이션을 더 확장 가능하게 만들 Apache의 대체물에 불과하지 않다. 그것은 전혀 사실이 아니다. 지금은 Node의 수명 중에서 여전히 초기 단계이지만, 엄청나게 급격히 성장하고 있으며 해당 커뮤니티가 매우 적극적으로 관여하고, 작성되는 훌륭한 모듈이 매우 많고 이렇게 성장하는 제품은 독자의 비즈니스에 1년 내에 나타날 수 있다.


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Mike Abernethy

In his 13 years in technology, Michael Abernethy has worked with a wide variety of technologies and a wide variety of clients. He currently works as a freelance programmer specializing in Java high availability and jQuery. His focus nowadays is on Rich Internet Applications and making them both more complex and simpler at the same time. When he's not working at his computer, he can be found on the golf course, or more accurately in the bushes, looking for his ball.

Posted by 1010
98..Etc/node.js2012. 3. 10. 12:18
반응형
Posted by 1010