node.js 프로그래밍


발생일: 2013.02.01

문제:
1월부터 팀원들과 함께 노드 스터디를 진행하려고 'node.js 프로그래밍'이란 책을 샀더랬다.
헌데, 갑자기 팀이 나뉘어 모두 헤어지게 된 터라(ㅠ ㅠ),
스터디도 자연스럽게 해체됐고 읽다만 책만 덩그러니 남았다.

첫 몇 장의 내용이 꽤 괜찮았던 터라, 어제부터 남은 부분을 쭉- 읽어봤다.

중요한 요소 요소를 예제를 들어가며 이해하기 쉽게 잘 설명하고 있다.
예전에 몇몇 모듈을 만들어보다 겪었던 문제들에 대한 내용도 잘 설명되어 있더라.
미리 읽어봤더라면 시간을 많이 절약할 수 있었을 텐데...라는 생각이 들었다.^^

나중에 인덱스 용도로 참고할 목적으로 작성한 메모를 옮겨둔다.

여기선 4장부터의 내용만 메모했다.
1장의 내용은 이전 포스트를 참고하면 되고,
2장과 3장은 설치 방법과 기본 모듈에 대한 내용이라 노드 API를 참고하면 되겠다.


해결책:

4장. npm을 이용한 의존성 확장 모듈 관리

npm 모듈
  - 글로벌 설치: 커맨드라인에서 명령어로 사용한다면 
    /usr/local/lib/ 하위의 node_modules 디렉토리 아래에 설치
  - 로컬 설치: 소스에서 require로 접근한다면.
    현재 위치를 기준으로 node_modules 디렉토리에 설치

설치 시 권한 에러가 발생하면,
sudo를 사용하지 말고 /usr/local에 대한 접근 권한을 추가하라.
$ sudo chown -R $USER /usr/local

package.json
  package.json은 CommonJS의 Package/1.0 명세다.

npm은 dependencies 필드로 의존 확장 모듈을 관리한다.
package.json만 공유한다면 누구나 의존성 모듈을 제대로 설치할 수 있다.
node_modules는 소스 형상 관리에서 제외시켜서 필요한 소스만 관리할 수도 있다.
  {
    "dependencies": {
      "moduleName": "version",
      "name": "> version"
    }
  }

devDependencies는 개발할 때만 필요한 모듈을 명시한다.
config의 production 속성이 true로 되어 있을 때에는 설치하지 않는다.

npm init ---> package.json 자동 생성

npm install 모듈명 --save : 자동으로 현재 모듈의 정보를 추가한다.


5장. 트위터 백업 애플리케이션 예제

rest 요청 모듈: restler 

스케쥴 모듈; node-schedule

터미널이 아닌 서버에서 돌리려면 nohup을 이용해 데몬 형태로 백그라운드로 실행해야 한다.
$ nohup node app.js &

데몬으로 실행되는 앱은 사용자가 로그아웃해도 계속 동작하며,
     ps -ef | grep node
로 조회할 수 있다.

만약, ssh로 접속해 nohup으로 애플리케이션을 실행했더라도,
콘솔 메시지를 출력하면 에러가 난다.
표준 출력이 없기 때문인데, 아래와 같이 표준 출력을 바꿔주면 된다.

$ nohup node app.js > temp.log &

forever 모듈: 별도의 nohup 명령어 없이 포에버가 데몬으로 실행하므로 편리하다.
$ forever start app.js
$ forever list # 목록 조회할 수 있다.


6장. 경량 웹 프레임워크 익스프레스

express 는 경량 웹 엔진
$ npm install -g express

$ express example # 스캐폴드를 만들 수 있다.
$ cd example && npm install # 의존 모듈을 설치한다.

app.set() : 특정 키 값을 설정
app.use() : 익스프레스에서 사용할 미들웨어를 결정

app.configure()의 첫번째 파라미터로 문자열을 전달하면 NODE_ENV 환경변수에 따라 설정을 적용한다.

$ NODE_EVN=production node app.js

(p.166) jade 사용법

(p.182) 몽고리안 DB

(p.185) 비동기 패턴의 의존성 해결하기
1. 콜백을 이용한 방법
2. EventEmiiter 를 이용한 방법

반복문 내의 비동기 해결 = How to Write a For Loop With Callbacks  = 재귀호출로 해결하자


7장. 리얼타임 웹사이트를 위한 Socket.io

socket.on('message');

socket.send('text', callback); // [서버/클라이언트] 콜백이 바로 실행됨.
socket.json.send(json);

socket.emit('eventName', data, callback); // 콜백은 전달될 뿐.
socket.on('eventName', function (res, callback) { }); // 받는 쪽에서 실행해야 함.

socket.volatile.emit(..); // [서버] 재전송 여부를 추적할 필요가 없는 메시지
socket.broadcast.emt(..); // [서버] 여러 상대에게 보내는 메시지

socket.of('/another').on(); // [서버] 네임스페이스 설정
var another = socket.connect('/another'); // [클라이언트] 해당 네임스페이스에 연결

socket.get();
socket.set(); // [서버] 소켓 세션에 키 저장

socket.join("방이름");
socket.leave("방이름"); // [서버] 방에 들어오거나 나간다.
socket.broadcast.to("방이름").emit(...); // 해당 방 전체에 메시지를 보낸다. (현재 연결된 소켓 사용자 제외)

io.socket.send()
io.socket.emit(); // 모든 사용자에게 이벤트를 전달.

io.socket.in("방이름").send()
io.socket.in("방이름").emit(); // 현재 연결된 소켓 사용자를 포함해 방 안의 모든 사용자에게 보냄


8장. Express + Socket.io Simple chat 예제
 
app.use(express.CookieParser()); // 쿠키 처리를 위한 미들웨어
app.use(express.session({secret: "secret key"}); // 세션 처리를 위한 미들웨어

app.get('/join/:id', function (req, res) {
  req.params.id; // 라우터에서 REST로 호출되는 id 처리  
});


9장. 디버깅

console.log(), console.info() 등 콘솔 메세지는 동일하게 표시되기 떄문에 큰 의미가 없다.

var util = require('util'); // 유틸 모듈에서 로깅 메시지를 제공한다.
util.log()
util.debug() 
util.inspect()

$ node --debug app.js # 디버깅 모드로 실행한다. (웹앱 같이 계속 동작하는 경우)
$ node --debug-brk app.js # 디버그 모드로 실행하고 첫 라인에서 중단한다.

node-inspector : 웹킷 브라우저를 통해 디버깅 할 수 있는 모듈


10장. 유닛 테스트

대표적인 TDD 프레임워크 : expresso

기본적으로 node의 assert를 사용하고 있지만, 추가 기능을 더 제공한다.
특히, assert.reponse(server, req, res|fn, [msg|fn]); 웹 서버에 대한 테스트를 제공한다.
테스트 수행 시, 자동으로 웹서버를 실행한다.

node-jscoverage: expresso에 포함되어 있으며 테스트 커버리지를 확인할 수 있다

BDD 프레임워크: vows
- 컨텍스트는 토픽과 보우들로 구성되어 있다.
- 토픽은 실행 결과, 결과의 확인은 (단언문을 포함한) 보우가 처리한다.
- 컨텍스트는 서브 컨텍스트를 가질 수 있으며, 이 때 상위 컨텍스트의 토픽이 전달된다.
- 비동기 테스트가 가능하다.
  토픽 실행 시, 비동기 함수를 실행하면서 콜백을 `this.callback`으로 전달하면 각 보우가 실행된다.


11장. 클라우드 서비스 배포

PaaS = Platform as a Service, 클라우드가 플랫폼을 제공하는 것

(p.315) CloudFoundry: VMWare에서 제공하는 클라우드 서비스
(p.326) Heroku : 허로쿠, 웹다이노와 워커다이노의 개념
(p.334) Nojitsu : 조이엔트의 클라우드 서비스(책에는 no.de이지만 현재 nojitsu로 제공한다)



카테고리

분류 전체보기 (704)
About me. (6)
Daylogs (669)
비공개 (0)
영어공부 (0)
My works - 추억 (29)