node.js는 무엇인가? #1

그동안 봐야지 봐야지 하던 Node.js를 이제야 보기 시작했습니다. 


간단히 말하면 Node.js는 서버사이드에서 동작이 가능한 Javascript이지만 보통 서버사이드 자바스크립트라고 하면 생각할만한건 runat="server"같은 수준의 서버사이드 자바스크립트와는 차원자체가 다릅니다.또한 Jaxer나 Narwhar같은 서버스크립트 자바스크립트 환경도 존재하지만 Node.js는 약간 다릅니다. 원래는 nettues+의 Learning Server-Side JavaScript with Node.js 를 따라하면서 포스팅을 하려고 하였지만 Node.js를 만든 Ryan Dahl 가 JSConf 2009 에서 발표한 동영상을 보는 것이 훨씬 이해하기가 좋아서 Ryan Dahl의 발표영상을 링크합니다. 


Ryan Dahl: Node.js

동영상에 나오는 발표자료는 글자가 잘 보이지 않아서 Scribd에 올라와 있는 발료자료입니다. (JSConf정도 행사에 node.js같은 프로젝트를 들고 나오는 사람이 헤져서 글자도 잘 보이지 않는 나이키티셔츠를 걸치고 나와서 한다는 것이 재밌기도 하네요.)


Node.js JSConf 2009 


Node.js는 서버사이드 자바스크립트이며 Google의 자바스크립트 엔진인 V8이 빌트인되어 있습니다. Event 기반이며 non-blocking I/O를 지원합니다. 자바스크립트의 표준라이브러리 프로젝트인 CommonJS 의모듈시스템을 지원합니다.

Apache같은 웹서버들은 모든 요청마다 시스템 쓰레드를 생성하는 쓰레드 기반이고 대부분의 경우에는 잘 동작하지만 Friendfeed나 Google Wave같은 리얼타임 애플리케이션처럼 많은 long-lived커넥션을 사용하는 애클리케이션에는 적합하지 않고 확장(scale)하기가 어렵습니다. 위 프리젠테이션에서 Apache와 NGINX를 비교한 그래프를 보면 쓰레드기반인 Apache는 요청이 늘어날수록 메모리가 증가하지만 NGINX는 직선을 유지하는 것을 볼 수가 있습니다. 이는 NGINX는 Event Loop를 사용하기 때문입니다.

이런 쓰레드기반의 문제를 Event Loop를 이용하면 해결할 수 있습니다.(여기서 Event Loop라는 것은 동작을 요청한뒤에 콜백을 지정하여 동작이 완료되면 콜백이 실행되는 방식을 발합니다.) 그럼 왜 모두가 Event Loop를 사용하지 않는가하는 의문이 생깁니다. 

node.js 로고


Ryan Dahl은 문화적인(Cultural) 이유와 구조적(infrastructural)인 이유 2가지가 있다고 생각하였습니다. 


문화적인 이유는 우리가 프로그래밍을 배울때 인풋을 요청하면 요청한 인풋을 받을때까지 아무것도 하지 말라고 배웠기 때문입니다. 
1
2
3
puts("Enter your name: ");
var name = gets();
puts("Name: " + name);

위 코드는 인풋을 받아서 출력하는 익숙한 코드입니다. 인풋이 들어올때까지 아무것도 행하지 않습니다.
1
2
3
4
5
puts("Enter your name: ");
gets(function(name) {
     
puts("Name: " + name);
});

이벤트 루프방식인 위와같은 코드는 복잡하다는 이유로 거부되어 왔습니다.

구조적인 이유는 싱글쓰레드이벤트 루프는 논블럭킹 I/O를 요구하지만 대부분의 라이브러리들은 그렇지 않았습니다. POSIX I/O나 DB라이브러리들은 비동기요청을 지원하지 않았습니다. 하지만 현재는 EventMachine, Twisted등 좋은 이벤트루프 플랫폼이 존재하고 있지만 사용자들은 어떻게 다른 라이브러리들과 이것들은 조합할수 있을지 혼란스러워 하고 있으며 서버사이드 개발자들은 이벤트 루프와 넌블락킹 I/O에 대한 지식이 필요합니다.

하지만 Javascript는 Event Loop를 사용하도록 디자인되어 비동기 펑션과 클로져를 지원하고 한번에 하나의 콜백만 실행하며 DOM 이벤트 콜백을 통한 I/O를 지원하고 있습니다. 더군다나 자바스크립트의 문화는 이미 이벤트기반의 프로그래밍에 익숙해져 있습니다.



Design Goal
  • Function은 직접 플랫폼 I/O에 접속하지 않습니다.
  • Disk, network, 프로세스를 통해 데이터를 받기 위해서는 반드시 콜백(callback)을 사용합니다.   콜백을 사용할 수도 있습니다. (함수명sync()라는 함수들이 제공되고 있다는 AJ님의 제보에 따라 수정하였습니다. 위 PT의 28페이지에 must be라는 표현으로 보아 보통의 경우 callback을 권장하는 것으로 추측(?)됩니다.)
  • TCP, DNS, HTTP같은 프로토콜을 지원합니다.
  • HTTP feature를 지원합니다.(Chunk된 requst/response, Keep-alive, Comet을 위한 리퀘스트 홀딩
  • 클라이언트 사이드 자바스크립트 프로그래밍과 과거 학생때 배운 Unix 스타일에 친숙하게 디자인되었습니다.



Internal Design
  • Google의 V8 사용
  • Marc Lehmann이 만든 이벤트루프 라이브러리 libev 사용
  • Marc Lehmann이 만든 쓰레드풀 라이브러리 libeio 사용
  • Ryan Dahl이 만든 HTTP파서 http-parser 사용
  • Ryan Dahl이 만든 libev에 기반한 스크림 소켓 라이브러리 evcom 사용
  • Michael Tokarev가 만든 넌블럭킹 DNS resolver udns 사용


더 자세한 내용은 AJ님의 core perspective to node.js 를 참고하시면 도움이 될 것입니다. 



이 포스팅은 node.js는 무엇인가? #2 : Hello World 실행하기로 이어집니다. 


출처 - http://blog.outsider.ne.kr/480



node.js는 무엇인가? #2 : Hello World 실행하기

이 포스팅은 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를 많이 만지게 될것 같습니다.


updated: 2012-01-08


출처 - http://blog.outsider.ne.kr/481





'Framework & Platform > Node.js' 카테고리의 다른 글

node.js - npm 1.0 사용하기  (0) 2012.07.16
node.js - socket.io 소개  (0) 2012.07.12
node.js - CentOS에서 설치(install in linux)  (0) 2012.07.03
node.js - 소개 2  (0) 2012.06.07
node.js - 소개  (0) 2012.06.07
Posted by linuxism
,


기사 게재일:  2011 년 5 월 24 일 (출판일: 2011 년 8 월 02 일)

요약:  Node는 서버가 어떻게 작업해야 하는지에 대한 개념을 변화시킨 서버측 JavaScript 해석기입니다. 목표는 프로그래머가 고도로 확장 가능한 애플리케이션을 빌드하고 하나의 유일한 실제 머신만으로 수 만 개의 연결을 처리하는 코드를 쓰도록 사용하는 것입니다.


소개

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년 내에 나타날 수 있다.


참고자료

교육

제품 및 기술 얻기

토론


출처 - http://www.ibm.com/developerworks/kr/library/os-nodejs/




'Framework & Platform > Node.js' 카테고리의 다른 글

node.js - npm 1.0 사용하기  (0) 2012.07.16
node.js - socket.io 소개  (0) 2012.07.12
node.js - CentOS에서 설치(install in linux)  (0) 2012.07.03
node.js - 소개 3  (0) 2012.06.07
node.js - 소개  (0) 2012.06.07
Posted by linuxism
,


Node.js
Node.js 로고
원저자Ryan Lienhart Dahl
개발자Node.js 개발자
최근 버전0.2.4 / 2010년 10월 23일, 584일 경과
프로그래밍 언어C++자바스크립트
운영 체제맥 OS X리눅스솔라리스,FreeBSDOpenBSD마이크로소프트 윈도 (Cygwin), webOS
종류네트워크 애플리케이션 프레임워크
라이선스MIT 허가서
웹사이트http://nodejs.org/


Node.js는 V8 (자바스크립트 엔진) 위에서 동작하는 이벤트 처리 I/O 프레임워크이다. 웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안되었다.

Node.js는 파이썬으로 만든 Twisted로 만든 펄 객체 환경루비로 만든 이벤트머신과 그 용도가 비슷하다. 대부분의 자바스크립트가 웹 브라우저에서 실행되는 것과는 달리, Node.js는 서버 측에서 실행된다. Node.js는 일부 CommonJS 명세[1]를 구현하고 있으며, 쌍방향 테스트를 위해 REPL 환경을 포함하고 있다.


목차

  [숨기기

[편집]예제

Node.js로 작성한 hello world HTTP 서버:

var sys = require('sys'),
    http = require('http');
 
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);
 
sys.puts('Server running at http://127.0.0.1:8000/');

다른 예제, 7000번 포트를 여는 간단한 TCP Echo 서버:

var net = require('net');
 
var server = net.createServer(function (stream) {
    stream.setEncoding('utf8');
 
    stream.addListener('connect', function () {
        stream.write('hello\r\n');
    });
 
    stream.addListener('data', function (data) {
        stream.write(data);
    });
 
    stream.addListener('end', function () {
        stream.write('goodbye\r\n');
        stream.end();
    });
});
 
server.listen(7000, 'localhost');

[편집]같이 보기

[편집]주석

[편집]바깥 고리


===================================================================================


Node.js
저자라이언 다르
개발원Node.js Developers
초판2009 년 (3 년 전)
최신 버전0.6.9 / 2012 년 1 월 27 일 (4 개월 전)
최신 평가판0.7.1 / 2012 년 1 월 24 일 (4 개월 전)
프로그래밍 언어C + + , JavaScript
지원 OSMac OS X , Linux , Solaris ,FreeBSD , OpenBSD , WindowswebOS
종류이벤트 중심
라이센스MIT License
공식 사이트http://nodejs.org/
템플릿을 표시


Node.js 은 이벤트화된 되는 입출력 처리 Unix 계열 플랫폼에서 서버측 JavaScript 환경이다 ( V8 JavaScript 엔진 으로 동작한다). Web 서버 등의 확장 가능한 네트워크 프로그램의 계정을 의도하고있다 [1] . 라이언 다르 의해 2009 년 만들어진, 다르을 고용하고있다 Joyent 의 지원에 의해 성장하고있다 [2] [3] .

Node.js는 Python 의 Twisted , Perl 의 Perl Object Environment 영어 ) ​​, C 언어 의 libevent 영어 ) ​​, Ruby 의EventMachine 과 같은 목적을 가진다. 대부분의 JavaScript 와는 달리 Web 브라우저에서 실행되는 것이 아니라, 오히려 서버측 JavaScript의 일종이다. Node.js 일부 CommonJS 영어 버전 ) 사양을 구현하고있다 [4] .Node.js는 대화형 테스트에 REPL (Read-eval-print loop) 환경을 포함한다.

목차

  [ 숨기기 ] 

예제 편집 ]

Node.js에 따르면 HTTP 서버 버전의 Hello world :

var HTTP = require ( 'http' ) ;
 
http. createServer ( function  ( request , response )  { 
    response. writeHead ( 200 ,  { 'Content-Type' :  'text / plain' } ) ; 
    response. end ( 'Hello World \ n ' ) ; 
} ) . listen ( 8000 ) ;
 
console. log ( 'Server running at http://127.0.0.1:8000/' ) ;

포트 번호 7000 번으로 연결을 기다리고, 보낸 데이터를 에코 하는 간단한 TCP 서버 :

var NET = require ( 'net' ) ;
 
var Server = net. createServer ( function  ( stream )  { 
    stream. write ( 'hello \ r \ n ' ) ;
 
    stream. on ( 'data' ,  function  ( data )  { 
        stream. write ( data ) ; 
    } ) ;
 
    stream. on ( 'end' ,  function  ( )  { 
        stream. end ( 'goodbye \ r \ n ' ) ; 
    } ) ; 
} ) ;
 
server. listen ( 7000 ,  'localhost' ) ;

모듈 편집 ]

Node.js는 바이너리로 컴파일되는 많은 "코어 모듈"와 함께 제공된다. 그것은 네트워크 비동기 래퍼인 net 모듈의 다른 경로 또는 파일 시스템 버퍼 타이머보다 일반적인 스트림과 같은 기본적인 모듈을 포함한다. 타사 모듈을 사용하는 것도 가능하다. 그것은 미리 컴파일된 "node"기능 또는 일반적인 JavaScript 파일의 어느 쪽의 형식도 좋다. JavaScript 모듈 CommonJS 영어 버전 ) 모듈 사양 [5] 에 따라 구현된 모듈이 구현하는 함수나 변수에 액세스하려면 exports 변수가 사용된다 [6] .

타사 모듈은 node.js을 확장하거나 추상화 수준을 제공함으로써, Web 응용 프로그램에서 사용되는 다양한 미들웨어 구현할 수있다. 예를 들어 인기있는 프레임 워크로 connect 및 express가있다. 모듈은 단순한 파일로 설치할 수도 있지만 일반적으로 Node Packaeg Manager (npm)를 사용하여 설치된다. 그것은 의존 취급도 포함하여 모듈 빌드, 설치, 업데이트 도와 준다. 또한 모듈은 Node의 디폴트의 모듈 디렉토리에 설치하지 않고도 상대적인 경로 이름을 요청하여 찾아낸다. Node.js wiki 에 사용할 수있는 타사의 모듈 목록이 있습니다.

커뮤니티 편집 ]

주로 2 개의 메일링리스트 nodejs 과 nodejs-dev , 그리고 freenode 에 IRC 채널 # node.js을 중심으로 매우 활발한 개발자 커뮤니티가 존재한다. 커뮤니티 Node.js에 초점을 맞춘 개발자 회의이다 NodeConf 집결 [7] .

Windows 버전 편집 ]

0.5.1보다, Windows 네이티브 버전 바이너리 릴리스를했다 [8] . Windows 기본 릴리스에 대해서는 Microsoft 의 지원이 이뤄졌다. Windows 용 비동기 I / O (IOCP) 환경에 대응하기 위해 libuv [9] 을 만들어 추상화를 진행했다. 결과 libev, libeio 사용할 수있는 UNIX 기반 플랫폼과 IOCP를 사용하는 Windows 플랫폼의 출시가 가능하게되었다.

관련 항목 편집 ]


===================================================================================



구글 V8 자바스크립트 엔진
Google V8 JavaScript Engine
개발자구글
개발 상태개발중
프로그래밍 언어C++자바스크립트
운영 체제마이크로소프트 윈도맥 OS X리눅스FreeBSD안드로이드웹OS
플랫폼x86x64ARM
종류자바스크립트 엔진
라이선스BSD 라이센스
웹사이트http://code.google.com/p/v8/


V8 자바스크립트 엔진(V8 JavaScript Engine)은 구글에서 개발된 오픈 소스 JIT 가상 머신형식의 자바스크립트 엔진이며 구글 크롬 브라우저와 안드로이드 브라우저에 탑재되어 있다.[1] V8로 줄여 불리기도 하며, 현재 라스 백이 책임 프로그래머이다.[2] ECMAScript(ECMA - 262) 3rd Edition 규격의 C++로 작성되었으며, 독립적으로 실행이 가능하다. 또한 C++로 작성된 응용 프로그램의 일부로 작동할 수 있다.

[편집]같이 보기

[편집]주석

  1.  Lenssen, Philipp (1 September 2008). Google on Google Chrome - comic book. 《Google Blogoscoped》. Google. 17 August 2010에 확인.
  2.  Minto, Rob (27 March 2009). The genius behind Google’s web browserFinancial Times. 17 August 2010에 확인.

[편집]바깥 고리


===================================================================================


Google V8 JavaScript Engine 은 Google 이 개발하는 오픈 소스 의 JIT Virtual Machine 형식의 JavaScript실행 엔진이다 [2] . 문맥에 따라서는 단순히 V8 라고 불리는이 이름은 또한 "V8"로 알려진 V 형 8 기통 엔진에 유래하고있다 [3] . Google Chrome 과 안드로이드 Browser에서 채용되고있다.

ECMAScript (ECMA-262) 3rd Edition 규격, C + + 로 작성되어있다. 독립적으로 실행이 가능하며, C + +로 작성된 응용 프로그램의 일부로 작동할 수도있다.

Firefox 는 인터프리터에서 실행하여 통계 정보를 캡쳐 [4] 먼저 중간 코드로 변환하고 그 위에 JIT 컴파일하지만 V8에서는 중간 코드없이 인터프리터도 탑재하지 않고 처음 실행할 때 에서 컴파일하는 [2] .

개발 리더는 Java HotSpot 의 개발자이기도 한, Lars Bak .

V8의 어셈블러는 Strongtalk 어셈블러를 기반으로하고있다.

2010 년 12 월 '크랭크 샤프트'로 불리는 새로운 컴파일 환경을 도입 속도가 개선되었다.


===================================================================================


JIT 컴파일(just-in-time compile) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.

전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.

JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

최근의 자바 가상 머신에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 가상 머신이 바이트코드를 기계어로 변환한다



출처 - http://ko.wikipedia.org/wiki/Node.js






'Framework & Platform > Node.js' 카테고리의 다른 글

node.js - npm 1.0 사용하기  (0) 2012.07.16
node.js - socket.io 소개  (0) 2012.07.12
node.js - CentOS에서 설치(install in linux)  (0) 2012.07.03
node.js - 소개 3  (0) 2012.06.07
node.js - 소개 2  (0) 2012.06.07
Posted by linuxism
,