Advertisement banner image
Advertisement banner image
Image at ../data/upload/7/1203907Image at ../data/upload/4/1112674Image at ../data/upload/2/1046612Image at ../data/upload/9/838729Image at ../data/upload/6/820796Image at ../data/upload/9/766049Image at ../data/upload/0/766040Image at ../data/upload/5/746745
Sub Page View
Today Page View: 7
Yesterday View: 22
30 Days View: 324
Image at ../data/upload/4/937604

강좌 : 자바스크립트 - 3편, 노드 Node JS(5)

Views : 10,219 2013-09-21 15:32
필고 개발자 그룹 1269552300
Report List New Post

강좌 : 자바스크립트 3 편 - Node.js



요약

참고자료

Node 홈페이지

Node API

자료

Node 기본

왜 Node 인가?

Node 가 성공하게 된 이유

Node 의 설치와 실행

설치

리눅스에서 설치

실행

NPM

의존성 관리 : package.json

주의 사항

Event Driven I/O

Event Queue

Non-blocking 코드 ( 비동기 코드 )

on

Module : 모듈

모듈 로드 및 할당, 사용

객체 export

모듈 만들기 require

UTIL

Buffer

process.nextTick

파일

파일 읽기

HTTP 웹서버제작

http.serverRequest Object

req.url

req.headers

req.mothod

기타

http.serverResponse Object

writeHead

Socket.io

웹브라우저에서 사용하는 방법

기본 구조

기본 구조 2

LISTEN

ON

io.set

log level

socket.emit

socket.broadcast.emit

socket.broadcast.to('roomName').emit

io.sockets.emit

io.of('/namespaceName').emit

socket.join(‘room1’)

socket.leave(‘room1’)

socket.broadcast.to(‘room1’).emit

io.sockets.in(‘room1’).emit

백그라운드로 실행

Forever ( Background Running )

설치

사용법

실전 예제: 실행

실전 예: 실행되고 있는 프로세스(데몬) 목록

실전 예 : 종료

웹소켓 서버 & 클라이언트 제작

채팅 서버 & 클라이언트 제작

디버깅

Chrome 연동 디버거

설치

Inspector 설정

Inspector 실행

리눅스에서 실행

윈도우즈에서 실행

프로그램 실행

크롬 브라우저로 디버깅하기

Desktop Development ( 데스크톱, 윈도우 응용 프로그램 작성 )

설치

실행

배포

압축 실행 패키지

독립 실행 파일 만들기

NSIS 로 배포하기

요약

Node 는 Ryan Dahl 이라는 젊은 프로그래머가 개발한 것으로 구글의 V8 엔진과 이벤트 루프를 구현하는 하나의 platform 인데 지금은 Server Side Javascript 로 많이 이용되고 있다.

이 프로젝트는 처음에 다른 언어로 구현이 되었지만 프로젝트가 요구하는 조건을 충족하지 못하여 자바스크립트로 대체되었다.

물론 자바스크립트로 대체 된 이유는 그 만큼 자바스크립트가 띄어나다는 것을 증명하는 것이다.

자바스크립트에서 함수는 first class object 의 기능을 모두 충족하며 closure 의 기능 등 타 언어에서 찾아보기 힘든 막강한 파워를 가지고 있다.

참고자료

Node 홈페이지

http://nodejs.org

Node API

http://nodejs.org/api/

자료

http://mobicon.tistory.com/304

http://www.nodebeginner.org/index-kr.html

http://nodejs-kr.org/insidejs/archives/609

http://ohgyun.com/370

Node 기본

왜 Node 인가?

갑자기 튀어나온 Node 란 무엇인가?

지금도 충분히 행복한데 왜 듣도 보도 못한 Node 를 사용해야 하는가?

사실 노드는 아직 버젼이 0 으로 시작한다. 버젼이 0.9.8 이런식으로 매겨져 있는 것으로 완숙되지 않은 개발 환경이다.

2013 년 9월 19일 현재 nodejs.org 에서 보니 최신 버젼이 0.10.18 이다.

이런 미숙한 개발 환경에 왜 신경을 써야 하는지 이해를 못하리라 생각하지만 세상 사람들이 모두 Node 에 대한 칭송을 아끼지 않는다면 그만한 이유가 있지 않을까?

Node 가 성공하게 된 이유

“성공했다” 라고 표현하는 것이 너무 어슬픈 표현이라는 것 잘 압니다. 특히 Node 에 대해서 잘 알지 못하는 분들이나 Node 를 처음 접하시는 분들은 왠듣도 보도 못한 것이 설치는 것에 대해서 황당해 할 것입니다.

그래도 Node 가 성공한 이유를 대라고 한다면, 아래와 같습니다.

1. 쉽다.

2. 강력하다.

Server/Client 프로그래밍을 해 보신 분이 Node 를 보신다면 정말 놀랄 것입니다.

Node 의 설치와 실행

설치

node 를 설치하는 것은 그냥 일반 소프트웨어를 설치하는 것과 크게 다르지 않다.

설치를 하게 되면 자동을 환경 변수에 node 실행 프로그램의 경로를 등록하여 CLI ( 도스창 또는 Command Line Interface ) 에서 “node” 와 같이 바로 실행을 할 수 있다.

리눅스에서 설치

리눅스에서 설치 엮시 아주 간단하다. 그냥 다운 받아서 압축 풀면 그걸로 끝이다.

다만 윈도우에서 처럼 자동으로 경로 지정을 하지 않으므로 적당하게 경로를 지정해야 한다.

예를 들어 아래와 같이 특정 폴더에 압축을 풀고 그 아래의 bin 폴더에 있는 node 나 npm 을 실행하면 그냥 된다.

/usr/local/src/node/node-v0.10.17-linux-x64

환경 변수에 등록은 .bash_profile 과 같은 곳에서 아래와 같이 하면 된다.

PATH=$PATH:$HOME/bin:/usr/local/src/node/node-v0.10.17-linux-x64/bin

실행

알아서 실행을 하면 된다.

리눅스에서는 “#!/usr/bin/env node” 와 같이 쉘 경로를 추가하여 “./myfile.js” 와 같이 실행을 할 수 있다.

[thruthesky@workserver tmp]$ vi hello

[thruthesky@workserver tmp]$ chmod 755 hello

[thruthesky@workserver tmp]$ ./hello

hello

NPM

npm https://npmjs.org/ 은 node package module 의 약자로서 npm install 로 모든 패키지(또는 모듈)를 설치 할 수 있다.

-g 옵션으로 설치하면 전체 계정(또는 어느 위치에서든)에서 사용가능한 (패키지 또는 모듈) 버젼을 설치한다.

만약 별도의 버젼을 유지하고 싶을 때 -g 옵션없이 패키지를 설치하면 되며 이 때에는 설치되는 패키지가 node_module 이라는 폴더에 저장이 된다.

의존성 관리 : package.json

https://npmjs.org/doc/json.html

package.json 파일에는 여러가지 정보가 들어간다.

dependencies: 항목에 필요한 모듈을 적어주면 npm install 만 입력 할 경우, 해당 모듈을 자동 설치한다.

각 버젼별로 지정을 할 수 있다.

주의 사항

name 에는 공백이 있으면 안된다. 따라서 공백 대신 - 를 지정했다.

버젼은 0.0.1 과 같이 숫자가 3개 이어야 한다. 0.1 로 하면 안되고, 0.0.1 과 같이 해야 한다.

반드시 쌍 따옴표를 써서 감싸야 한다.

예)

{

       "name": "CenterX-Server",

       "version": "0.0.1",

       "private": true,

       "dependencies": {

               "express": "3.3.5",

               "socket.io": "0.9.16"

       }

}

Event Driven I/O

Event Driven I/O 는 Node 의 핵심이다.

아래의 예와 같이 callback 을 사용하면 비동기 방식으로 query 부분을 빠져나가고 나중에 query 대한 I/O 가 발생하거나, 끝났을 때 또는 적절한 때에 callback 내의 관련 코드가 실행된다.

db.query(‘SELECT * FROM posts WHERE id=1’, function(post) {

...

});

위 코드는 여러분이 Javascript 코딩을 하면서 수 없이 다뤄왔던 단순한 callback 방식이다. 이러한 콜백 방식으로 Javascript 는 동기화 문제를 해결 했으며 Event 을 발생시키고 또 반대로 Event 를 받아서 처리하는 것을 callback 형식으로 처리를 한다.

Event Queue

Event Driven I/O 를 잘 이해한다는 것은 Event Queue 의 동작 방식에 대해서 잘 이해를 하고 있다는 것이다.

일반적으로 spawn, pork, thread 의 개념에서 동시에 여러개의 일을 처리 할 수 있는 방법이 있는데 이것은 Event Queue 와는 약간 다른 방법이다.

Event Queue 란 Event 를 Queue 형식으로 저장을 해 놓고 하나 하나 씩 이벤트를 실행하는 것을 말한다.

예를 들어 콜백을 정의 해 놓고 해당 이벤트가 발생하면 즉시 실행되기를 기대하고 있지만, 사실은 해당 이벤트는 즉시 실행되지 않고 Event Queue 에 저장되어 그 이벤트가 실행 될 순서를 기다려야 한다.

그런데 만약 자기가 빨리 실행되어야 하는데, 앞에서 실행하는 이벤트가 늦장을 부린다면 큰일이다.

따라서 여러분이 콜백 함수 코딩을 할 때 blocking 코드를 작성해서는 안된다. 급하지 않는 일은 콜백 안에서 다시 콜백해서 Event Queue 에 집어 넣도록 해야 할 것이다.

Non-blocking 코드 ( 비동기 코드 )

Node 는 거의 완벽한 Asynchronous 시스템이다.

Asynchronous 와 Synchronous 가 헷갈리는 경우가 많은데, Asynchronous 는 프로그램의 실행 순서가 없는 뒤죽 박죽 상태를 생각하면 된다. 반대로 Synchronous 는 순서가 있는 잘 정렬된 상태를 생각하면 된다.

Asynchronous 를 non-blocking (순서를 기다리지 않는) 코드라 하고 Synchronous 를 blocking (하나가 끝나야 다른 하나가 실행되는) 코드라 한다.

Asynchronous 하지 않은 함수는 “Sync” 로 표시되어져 있고 Sync 로 표시되지 않은 것 중에서 Asynchronous 하지 않은 것은 require 뿐이다.

이러한 Asynchronous 하지 않은 것들은 반드시 초기화 할 때만 사용되어져야 한다.

이벤트는 큐에 저장되고 그 처리는 callback 함수로 한다.

따라서 callback 함수를 최대한 빨리 리턴해야한다. 그래야지만 다음 callback 함수가 실행될 수 있다.

아래와 같이 exec() 는 비동기적으로 작동한다. 따라서 아래와 같이 하면 “dir /S C:\Users” 를 실행하는 동안 다른 코드가 실행될 수 있다. 하지만 exec 의 callback 함수에서 작업을 한다면 blocking 코드로 동작하게 된다.

exec("dir /S C:\Users",

   { timeout: 10000, maxBuffer: 20000*1024 },

   function (error, stdout, stderr) {

     response.writeHead(200, {"Content-Type": "text/plain"});

     response.write(stdout);

     response.end();

   });

on

on 은 addListener 의 또 다른 별칭이라고 생각하면 된다.

예를 들면 server.addListner 를 server.on 으로 줄여서 쓸 수 있는 것이다.

server.on(‘abc’, function() { ... });

와 같이 정의되어져있으면 ‘abc’ 라는 이벤트를 listenning 한다고 보면 된다.

Module : 모듈

모듈은 아래와 같이 require 를 통해서 사용 할 수 있다.

var module = require(‘module_name’);

만약 require() 에 들어가는 모듈 이름이 “/” 또는 “.” 으로 시작하는 상대 또는 절대 경로이면 사용자 정의 모듈을 사용하는 것이 된다.

모듈 로드 및 할당, 사용

아래와 같이 하면 http 모듈을 로드하여 http 변수에 지정하는 것이다.

var http = require('http');

(모두 알겠지만 var 로 지정하면 글로벌이 되지 않는다. 따라서 var http 로 하면, 모듈 안에서는 액세스가 안되므로 주의 한다.)

만약 정확한 파일이름을 가지고 찾다가 실패한다면, .js 확장자를 붙여서 로딩을 시도할 것이다. 그것도 안되면 .node 확장자를 붙여서 시도한다.

.js는 자바스크립트 텍스트 파일로 해석하고, .node 파일은 dlopen을 통해 로딩되는 컴파일된 애드온 모듈로 해석한다.

‘/’로 시작하는 모듈의 위치를 절대 경로표시하는 것이다.

예를들면,

require(‘/home/marco/foo.js’)

는 /home/macro/foo.js를 로딩할 것이다.

‘./’로 시작하는 모듈은 파일에 대한 상대 경로이다.

‘/’나 ‘./’가 없다면 그 모듈은 핵심 모듈이 아니면 node_modules 디렉토리(또는 글로벌 디렉토리)에서 로딩된다.

객체 export

node 는 간단한 모듈 로딩 기능을 가지고 있다. node 에서는 하나의 파일에 하나의 모듈만 저장된다.

모듈에서 객체를 export할 때는 exports 객체에 추가하기만 하면 된다.

모듈 만들기 require

require 는 반드시 모듈의 객체를 저장하는 변수가 지정되거나 활용되어야 한다.

즉,

require(‘./chat.js’);

와 같이 하면 에러가 나며

var chat    = require('./chat.js');

와 같이 require 모듈의 객체를 변수로 받아야 한다.

그리고 그 안의 함수를 사용하기 위해서는 export 를 해야 한다.

chat.js 파일 예제

console.log('chat.js loaded');

exports.version = function()

{

       return '0.0.1';

}

사용 예

console.log("Server Running on 8080 with chat version:"+chat.version());

UTIL

Node 에는 util 이라는 모듈이 있는데 코딩을 할 때 여러가지 도움을 준다.

#!/usr/bin/env node

var util = require('util');

util.log('hello');

var a = { 'hello': 'world' };

util.log( util.inspect(a) );

[thruthesky@workserver tmp]$ ./hello

20 Sep 16:43:57 - hello

20 Sep 16:43:57 - { hello: 'world' }

Buffer

Javascript 에서 binary data 를 다루기가 쉽지 않은데, Node 에는 buffer 를 추가해서 이를 해결 한다. node 의 기본 데이터 전송 방식이 바로 이 buffer 를 통해서 이루어진다.

var buffer = new Buffer('this is the string in my buffer');

var slice = new Buffer(10);

var targetStart = 0,

sourceStart = 10,

sourceEnd = 20;

buffer.copy(slice, targetStart, sourceStart, sourceEnd);

console.log(slice);

process.nextTick

해당 callback event 를 event queue 맨 마지막에 집어 넣는다. 즉, 다음 이벤트 루프에 집어 넣는 것이다.

이 것은 setTimeout( function() { ... }, 0 ) 과 같은 코드를 대체하고자 할 때 사용한다.

#!/usr/bin/env node

var util = require('util');

process.nextTick( function() {

       util.log('hello');

});

util.log( "world!" );

[thruthesky@workserver tmp]$ ./hello

20 Sep 16:47:43 - world!

20 Sep 16:47:43 - hello

파일

파일 읽기

아래와 같이 파일 읽기를 할 수 있다. 파일을 열고 읽는 것이야 다른 언어와 비교해서 다를 바가 없다. 다만 Event Driven 방식이라는 것에 중점을 두고 유심히 살펴 볼 필요가 있다.

타 언어에 비해서 코드가 짧은 편은 아니지만 blocking 을 하지 않는 다는 점에서 볼 때 타 언어에 비해서 차이점이 확연히 나타난다.

#!/usr/bin/env node

var fs = require('fs');

fs.open('world.txt', 'r', function( err, fd ) {

       if ( err ) { throw err; }

       var readBuffer = new Buffer(1024);

       bufferOffset = 0;

       bufferLength = readBuffer.length;

       filePosition = null;

       fs.read(fd, readBuffer, bufferOffset, bufferLength, filePosition, function(err,readBytes) {

               if ( err ) { throw err; }

               console.log('just read ' + readBytes + 'bytes');

               if ( readBytes > 0 ) {

                       console.log(readBuffer.slice(0, readBytes).toString());

               }

       });

});

HTTP 웹서버제작

HTTP 모듈을 통해서 손 쉽게 웹 서버를 제작 할 수 있다.

http 모듈에는 여러가지 함수가 있는데, createServer 라는 함수가 있다. 이 함수는 객체를 리턴하는데 이 객체에는 listen 이라는 함수가 있다.

즉, 아래와 같이 하면 http 모듈의 createServer 함수를 통해서 웹 서버 객체를 받는 것이 된다. 그리고 그 객체의 listen 이라는 함수를 통해서 해당 포트를 listen 하게 된다.

아래의 코드는 단 한줄 짜리지만 실제로 웹서버로서 동작한다. 다만 하는 것이 아무것으며 웹클라이언트는 대기상태로 빠진다.

require('http').createServer().listen(9999);

http.createServer(function(request, response) {

response.writeHead(200, {'Content-Type': 'text/html'});

response.write('<h1>Hellow World</h1>');

response.end();

}).listen(8888);

소스코드는 아래와 같다.

[thruthesky@workserver tmp]$ vi s

#!/usr/bin/env node

var http = require('http');

var server = http.createServer();

server.on('request', function(req,res) {

       res.writeHead(200, {'Content-Type': 'text/plain'});

       res.write("Hello World");

       res.end();

});

server.listen(4000);

[thruthesky@workserver tmp]$ chmod 755 s

[thruthesky@workserver tmp]$ ./s

아래와 같이 웹 브라우저로 접속을 해서 테스트를 해 본다. 참고로 workserver 는 본인의 개인 작업 서버이다. 인트라넷에 있으니 외부에서는 접근을 할 수 없다. 여러분은 여러분 나름데로의 인트라넷을 구축하면 된다.

http://workserver.org:4000/

http.serverRequest Object

웹 클라이언트가 웹 서버로 요청을 할 때 여러가지 정보를 담고 있다.

req.url

클라이언트가 웹 서버로 요청을 하면 요청한 URL 경로를 전달하는 데 이것은 createServer 의 callback 함수 중 첫번째 인자의 url 속성에 기록이 된다.

이 값에는 schema 와 hostname 은 빠져 있다.

소스

#!/usr/bin/env node

require('http').createServer(function(req,res) {

       res.writeHead(200, {'Content-Type': 'text/html'});

       res.end("<h2>Request URI : " + req.url + "</h2>");

}).listen(4000);

접속

http://workserver.org:4000/hello_world!?abc=123

결과

Request URI : /hello_world!?abc=123

다음 그림은 URL 의 각 부분 별로 어떻게 사용 할 수 있는지 나타내준다.

req.headers

웹 클라이언트가 웹 서버에게 보내는 헤더(메타) 정보를 가지고 있다.

#!/usr/bin/env node

var util = require('util');

require('http').createServer(function(req,res) {

       res.writeHead(200, {'Content-Type': 'text/plain'});

       res.end(util.inspect(req.headers));

}).listen(4000);

req.mothod

GET, POST, DELETE 등의 method 정보를 가지고 있다.

기타

이외에도 아래와 같은 property 와 method 들을 사용 할 수 있다.

req.httpVersion

req.trailers

req.setTimeout(msecs, callback)

req.statusCode

req.socket

http.serverResponse Object

웹 서버가 웹 클라이언트로 데이터(또는 응답)를 보낼 때 사용하는 것으로 이 객체는 서버에 의해서 만들어지며 request 이벤트의 두번째 인자로 전달된다.

주로 사용하는 메쏘드는 아래와 같다.

writeHead()

write()

end()

브라우저로 데이터를 보낼 때

먼저 writeHead() 를 통해서 보내는 데이터의 정보를 알려주고

write() 를 통해서 데이터를 출력한 다음

end() 를 통해서 데이터 출력이 끝났음을 알린다.

writeHead

response.writeHead(statusCode, [reasonPhrase], [headers])

BODY 나 기타 HTML 을 출력하기 이전에 보낼 수 있다.

예) 아래와 같이 캐시 컨트롤 등 여러가지 정보를 같이 보낼 수 있다.

response.writeHead(200, {

‘Content-Type’: ‘text/palin’,

‘Cache-Conrol’: ‘max-age=3600’

});

아래와 같이 헤더를 변경하고 삭제할 수 있다.

setHeader

removeHeader

response 객체의 모든 속성과 메쏘드 정보를 알기 위해서는 API 를 참조해야한다.

http://www.nodejs.org/api/http.html#http_class_http_serverresponse

Socket.io

https://github.com/LearnBoost/Socket.IO

https://github.com/learnboost/socket.io/wiki

서버에서 동작하는 것과 웹브라우저 안에서 동작하는 두가지가 있는데 거의 동일하며 같은 모듈이다.

Socket.IO 는 기본적으로 WebSocket protocol 을 사용한다.

따라서 웹서버의 기능을 먼저 구현한 다음 socket.io 가 모니터(listen) 할 수 있도록 연결을 해 주어야 한다.

따라서 다음과 같이 코드가 만들어 진다.

먼저 웹서버 생성

웹서버를 socket.io 에 연결

socket.io 에서 이벤트에 따라서 처리

여러가지 역활을 할 수 있지만 기본적으로 WebSocket Wrapper 이며 접속된 클라이언트의 정보를 관리하는 asynchronous I/O 이다.

클라이언트와 서버가 좀 더 원할히 통신을 할 수 있도록 도와주는 도구라고 생각하며 된다.

웹브라우저에서 사용하는 방법

HTML 을 뿌려 줄 대, 서버가 있는 위치에 HTML 이 있다면 단순히 아래와 같이 하면 된다.

<script src="/socket.io/socket.io.js"></script>

만약, 다른 위치라면 socket.io 모듈이 설치된 절대 경로를 적어 주어야 웹 브라우저가 해당 JS 를 로드 할 수 있다.

기본 구조

var socket = new io.Socket();

socket.on('connect', function(){

   // connected!

});

socket.on('message', function(msg){

   // message coming

});

socket.send('Hello world!');

기본 구조 2

아래와 같이 객체를 생성하는데,  인자 값을 포트나 웹 서버 객체 등 여러가지 값을 줄 수도 있다.

var io = require('socket.io')();

// 또는

var Server = require('socket.io');

var io = new Server();

LISTEN

아래와 같이 먼저 웹 서버(특정 포트)를 만들고 그리고 그 웹 서버를 통해서 websocket 통신을 있는 경우, socket.io 가 맡아서 처리를 한다.

var http = require(‘http’).createServer(handler).listen(8080);

var io = require(‘socket.io’).listen( http );

ON

io.sockets.on(‘connection’, function(socket){...});

새로운 소켓 (클랑이언트) 접속이 있을 때 마다 발생한다.

socket.on(“MESSAGE_EVENT”, function(data){...});

클라이언트가 “MESSAGE_EVENT” 이벤트를 보내면 해당 EVENT_MESSAGE 를 가지고 있는 이벤트(콜백)가 실행된다.

io.sockets.emit(“NEW_EVENT_MESSAGE”, { message: data[“message data”]});

서버가 클라이언트로 메세지 이벤트를 데이터와 함께 보낸다.

socket.on 은 하나의 클라이언트로 부터 메세지가 도착 한 경우이다.

io.sockets.emit 는 모든 클라이언트로 보내는 메세지이다. 즉, broadcast 이다.

socket.on(‘...’, function( ... ) 으로 넘어오는 값이다 socket.emit(‘event’, ...data...) 에서 보내는 값은 굳이 JSON 일 필요가 없다. 그냥 문자열이어도 된다.

io.set

각종 정보를 설정한다.

log level

아래와 같이 하면 콘솔 로그 정보에 heartbeat 가 나오지 않는다. handshaking 과 disconnect 정보가 나온다.

io.set('log level', 2);

socket.emit

연결된 현재 소켓(클라이언트)에게만 데이터를 전송한다.

socket.emit('eventName', { data: 'tosend' });

socket.broadcast.emit

연결된 현재 클라이언트 소켓만 빼고 모두에게 데이터를 전송한다.

socket.broadcast.emit('eventName', { data: 'tosend'});

socket.broadcast.to('roomName').emit

특정 room 에 있는 소켓들에게만 데이터를 전송한다.

socket.broadcast.to('roomName').emit('eventName', {data: 'tosend'});

io.sockets.emit

서버에 연결된 모든 클라이언트에게 데이터를 보낸다.

io.sockets.emit('eventName', { data: 'tosend'});

io.of('/namespaceName').emit

특정 namespace 있는 소켓들에게 데이터를 보낸다.

io.of('/namespaceName').emit('eventName', { data: 'tosend'});

socket.join(‘room1’)

방에 들어간다.

socket.leave(‘room1’)

방을 나간다

socket.broadcast.to(‘room1’).emit

현재 접속된 소켓만 빼고 room1 방에 있는 모든 소켓에게 데이터를 보낸다.

io.sockets.in(‘room1’).emit

room1 에 있는 모든 소켓에게 데이터를 보낸다.

백그라운드로 실행

리눅스에서 아래와 같이 백그라운드로 실행 할 수 있다. 하지만 터미널을 빠져나가면 자동 종료된다.

./myfile.js &

Forever ( Background Running )

https://github.com/nodejitsu/forever

Forever 모듈을 사용하면 백그라운드로 실행 되며 crash 가 발생해도 자동으로 다시 실행된다.

설치

npm install forever

사용법

usage: forever [start | stop | stopall | list] [options] SCRIPT [script options]

options:
 start          start SCRIPT as a daemon
 stop           stop the daemon SCRIPT
 stopall        stop all running forever scripts
 list           list all running forever scripts

실전 예제: 실행

$ ./node_modules/forever/bin/forever start server.js

실전 예: 실행되고 있는 프로세스(데몬) 목록

$ node_modules/forever/bin/forever list

실전 예 : 종료

$ ./node_modules/forever/bin/forever stop server.js

// 또는 전체 종료

$ ./node_modules/forever/bin/forever stopall

웹소켓 서버 & 클라이언트 제작

채팅 서버 & 클라이언트 제작

디버깅

Node 를 디버깅하는 기법에는 여러가지가 있는데 크롬 연동 디버거를 꼭 한번쯤 시도 해 볼만하다.

웹서버 등도 디버깅을 하며 실시간으로 코드 수정이 가능하다.

Chrome 연동 디버거

8080 포트와 5858 포트를 기본적으로 사용한다.

소스 파일 열기, 실시간 수정 등이 가능하다.

한 마디로 크롬 브라우저가 IDE 가 된다. CTRL+S 를 누르면 저장되고 바로 적용된다.

주의 : 2013년 9월 현재 한글을 쓰면 안된다. 주석에도 한글을 쓰면 안된다.

설치

$ npm install node-inspector

Inspector 설정

크롬 웹 브라우저로 소스를 직접 수정하고 저장하기 위해서

$ vi node_modules/node-inspector/config.json

와 같이 해서 아래 부분을 true 로 한다.

"saveLiveEdit": true,

Inspector 실행

리눅스에서 실행

$ ./node_modules/.bin/node-inspector &

윈도우즈에서 실행

윈도우즈에서는 cmd 창을 두개 띄워서 하나는 node-inspector 를 실행하고 하나는 서버 프로그램을 실행하면 된다.

CMD> cd node_modules/.bin

CMD> node-inspector.cmd

프로그램 실행

아래와 같이 --debug 옵션을 주어야 한다.

$ node --debug server.js

크롬 브라우저로 디버깅하기

아래와 같은 주소로 접속을 하면 된다.

http://workserver.org:8080/debug?port=5858

주의 할 점은 프로그램을 --debug-brk 옵션으로 실행하면 프로그램이 실행되자 마자 브레이크가 걸린다. 따라서 크럼 웹에서 실행을 해 주어야 한다.

Desktop Development ( 데스크톱, 윈도우 응용 프로그램 작성 )

일반적으로 node 는 Server Side Javascript 로서 서버/클라이언트 프로그래밍에 주요한 역활을 한다.

하지만 node-webkit 을 통해서 데스크톱 응용 프로그램도 작성 할 수 있다.

Node-Webkit 은 자바 런타임과 마찬가지로 Node.JS 와 Chromium 을 기반으로 하는 하나의 RUN TIME 이다.

홈페이지 : https://github.com/rogerwang/node-webkit

node-webkit 은 Intel 에서 후원하는 만큼 안정적으로 꾸준히 발전을 하고 있다.

설치

그냥 다운받아서 압축을 풀면 끝이다.

실행

편집 중에 테스트를 하고 싶다면, 아래와 같이 mw 파일만 실행하면 package.json 파일을 읽서 실행한다.

CMD> nw

배포

배포를 위한 패키징도 의외로 간단하다.

압축 실행 패키지

  1. zip 으로 압축을 하면 된다.
    zip 압축을 할 때, package.json 과 관려 파일을 압축해 넣고 압축을 하면 확장자가 .zip 이된다.
    이걸로 끝이다.

그리고 아래와 같이 실행하면 된다.

nw.exe “zip 파일 이름.zip”

더블 클릭해서 실행하기 위해서는 확장자를 .nw 로 바꾸고 오른쪽 마우스 클릭 Property 에서 Open With 을 통해 nw.exe 를 선택해 주면 된다.

또는 아래와 같이 독립 실행 파일을 만들면 된다.

독립 실행 파일 만들기

위에서 압축 실행 패키지를 만들고 아래와 같이하면 독립 실행 파일이 만들어진다.

압축 파일이름이 app.zip 이라고 가정

CMD> copy /b nw.exe+app.zip app.exe

따라서 불편하게 확장자를 연결 할 필요 없다.

Packing

package.json 은 배포본의 정보를 가지고 있다.

{

“name” : “name”

“window” : {

“width” : 800,

“height” : 600,

“toolbar” : false,

},

“main” : “index.html”

}

NSIS 로 배포하기

필요한 파일들을 하나의 디렉토리에 담는다.

  본 글을 신고하시겠습니까?
Report List New Post
Cheap nfl vintage jerseys [쪽지 보내기] 2013-10-06 07:51 No. 1269562219
Thanks for making the effort to doubt this, Thought about feel strongly to fix it and absolutely adore learning extra on that topic. Should doable, whenever you achieve encounter, would most people thoughts updating your website with extra info? This is helpful in my circumstances.
Cheap nfl vintage jerseys www.southaven2.com/vintage_nfl_jerseys.html
Cheap nfl nike jerseys [쪽지 보내기] 2013-10-08 05:12 No. 1269563473
This post continues to be somewhat of your revelation if you ask me
replica soccer jerseys [쪽지 보내기] 2013-10-12 13:11 No. 1269566756
Thanks for the auspicious writeup. It actually used to be a enjoyment account it. Look advanced to far delivered agreeable from you! However, how could we communicate?
blank basketball jerseys [쪽지 보내기] 2013-10-14 06:46 No. 1269567509
It was a truly nice approach! Just wanna give you thanks for the information you contain apportioned. Really continue publishing...
깜씨 [쪽지 보내기] 2013-12-09 16:04 No. 1269617234
감사합니다. 유용하게 읽었습니다.
필고 개발자 그룹
No. 95
Page 3
권오창@페이스...  3224  19-04-07
만강이  2860  15-08-31
Photo Post thumbbail image
whizenglish  4309  15-06-20
Post thumbnail image
whizenglish  7196  15-05-21
커먼웰쓰  3479  15-05-14
바다디다  2591  15-02-21
dnfkfkfkfkf  3464  15-01-25
필고관리자  2991  15-01-03
Post thumbnail image
필고관리자  9941  15-01-03
굿리  3395  15-01-02
요잇  3259  14-12-11
jeremyPark  3053  14-12-03
Post thumbnail image
thruthesky  39687  14-09-30
필고관리자  3444  14-09-30
오늘도잠온다  3776  14-05-03
오늘도잠온다  3375  14-04-07
필고관리자  4233  14-01-15
thruthesky  10564  14-01-11
thruthesky  5612  13-12-22
Post thumbnail image
thruthesky  6819  13-12-16
thruthesky  10269  13-11-26
thruthesky  3825  13-11-24
thruthesky  2184  13-11-10
thruthesky  2557  13-11-10
thruthesky  4845  13-11-10
thruthesky  3689  13-11-10
thruthesky  2698  13-09-29
Post thumbnail image
thruthesky  7972  13-09-28
Post thumbnail image
thruthesky  10948  13-09-28
오늘도잠온다  4605  13-09-27
오늘도잠온다  2133  13-09-27
Photo Post thumbbail image
필고관리자  10220  13-09-21
thruthesky  2790  13-09-15
Photo Post thumbbail image
thruthesky  5836  13-09-12
Photo Post thumbbail image
thruthesky  2574  13-09-11
Photo Post thumbbail image
thruthesky  12933  13-09-10
Photo Post thumbbail image
thruthesky  12162  13-09-08
Photo Post thumbbail image
thruthesky  5245  13-09-07
thruthesky  3951  13-09-03
깜씨  3561  13-09-02