Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

express가 2.5에서 3.0으로 올라가면서 달라진 점

node.js의 킬러 웹 애플리케이션인 express가 최근 3.0으로의 메이저 업그래이드를 준비하고 있고 현재 3.0 RC5까지 릴리즈된 상태다. express 2.5에서 3.0으로 마이그레이션하는 가이드가 잘 정리가 되어 있어서 딱히 신경을 쓰고 있지는 않았는데 이 때문에 내 책을 보고 공부하시는 분들이 예제를 따라하면서 3.0에서는 제대로 동작하지 않아서 최근에 문의가 종종 들어오는 터라 A/S 차원(?)에서 정리를 좀 해야겠다고 느꼈다.


웹서버 생성
express 2.5에서는 웹서버를 다음과 같이 생성한다.

var express = require('express');
var app = express.createServer();
app.listen(3000, function(){ });

이 소스도 꽤 명확하다고 생각했는데 3.0에서는 웹서버를 생성하는 방식이 변경되어서 express 3.0을 설치하고 위의 소스를 사용하면 다음과 같은 경고문구가 나온다.

$ node app.js 
Warning: express.createServer() is deprecated, express
applications no longer inherit from http.Server,
please use:

  var express = require("express");
  var app = express();

express.createServer()가 폐기되어서 다음과 같이 서버를 생성해야 한다. 소스는 약간 더 같단해 졌지만 2.5와 가장 다른 점은 여기서 생성한 app이 http.Server 객체가 아니라는 점이다.

var express = require('express');
var app = express();
app.listen(3000);

2.5때처럼 http.Server 객체가 필요하다면 다음과 같이  사용하면 된다.

var express = require('express')
  , http = require('http');
var app = express();
http.createServer(app).listen(3000, function() { });


Socket.IO와의 연동
질문을 받아보니 Socket.IO와의 연동에서 가장 큰 문제가 되는 것 같다. 기존에는 다음과 같이 사용했다.

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

이 간단힌 코드만으로 express 웹서버와 Socket.IO를 연동할 수 있는데 express 3.0에서는 express()가 반환한 객체가 http.Server 객체가 아니기 때문에 이렇게 사용할 경우 Socket.IO에서 오류가 발생한다. 그래서 위에서 http.Server 객체를 생성하는 방법을 설명했듯이 http.Server를 생성해서 Socket.IO에 전달해야 한다.

var express = require('express')
  , http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);


Jade
Jade는 중복코드를 줄이기 위해서 Layout 방식과 Block 방식을 지원하는데 2.5에서는 Layout 방식을 기본으로 사용하고 있었다. (Block방식은 나중에 추가된 기능이다.) Layout 방식이라하면 layout.jade파일을 기본적인 공통파일로 두고 layout.jade 파일에 특정부분에 각 뷰파일을 끼워넣는 방식이다. Jade는 나중에 Django에서 가져온 Block을 이용한 상속방식을 추가했는데 사실 이 방식이 훨신 유연하고 사용하기가 편하다.(레이아웃 방식은 간단한 페이지를 괜찮지만 사이트가 좀 복잡해지면 엄청 불편해진다.) 그래서 Guillermo Rauch도 Use Jade blocks, not layouts라는 포스팅을 올렸다. 블락방식은 부모 Jade파일을 하나두고 각 블럭별로 오버라이드해서 쓸 수 있는데 가이드만 보면 사용할 수 있을 정도로 간단하다.


그 외에도 달라진 부분이 좀 있는데 메서드 부분이나 파라미터의 변경등이므로 마이그레이션 문서에서 확인할 수 있다. 이런 변형보다는 3.0에서 새롭게 추가된 것들이 좀 있어보이는데 3.0을 릴리즈하면서 개편한 express 홈페이지의 문서에서 확인할 수 있는데 솔직히 아직은 문서가 그리 자세하진 않다.(홈페이지는 이뻐졌지만...)


덧) 웹에서 제공하는 소스도 업데이트 해달라고 요청이 왔는데 이부분은 어떻게 할지 좀 고민중이다. node.js의 버전도 새버전이 나왔지만 심각한 호환성 문제는 없고 각 모듈의 버전업으로 인한 차이가 좀 더 영향이 큰데 모듈이 많아서 어떻게 할지 고민중이다. Github에 올려놓은 소스도 변경하면 책보고 하시는 분들이 오히려 헷갈릴테니까 바꾸기도 쉽지 않다. 현재 생각으로는 브랜치를 따서 새버전용으로 변경하는 것이 가장 나아보인다. 하지만 대부분 Github에 그리 익숙하지 않은데다가 모듈에 따라 일일이 업데이트하는것도 만만치 않은 작업이라 좀 고민 중에 있다.
2012/09/20 02:19 2012/09/20 02:19