Node.js 에서 가장 많이 사용하는 Express 프레임워크를 다시 둘러보면서 Connect를 살펴보았다. 데이터 스트림속에서 특정 객체를 가르키는 기술을 쿼리라고 본다. 예로 jQuery는 DOM내에서 특정 노드 객체를 쉽게 찾을 수 있고, Backbone은 el를 통하여 객체를 Fragment화해서 특정 위치에 Render해 준다
1. 자바스크립트 쿼리의 시대
- 제일 쿼리 : Underscore.js
+ 클라이언트 사이드의 Backbone.js의 핵심이 된다
- 제이 쿼리 : jQuery
+ 두말이 필요없다. 브라우져 호환성과 셀렉터 그리고 다양한 위젯과 스마트 디바이스 지원까지
- 제삼 쿼리 : Backbone.js
+ Client MV* Framework
+ 클라이언트 SPA (Single Page Web Application) 개발시 기본이 되는 프레임워크
- 삼.오 쿼리 : Node.js
+ 서버 사이드 엔진 (Async I/O, One Thread)
+ Server MV* Framework
+ Node.js가 Java의 JVM 이라면 Connect 는 Java의 WAS(Web Application Server) or Apache 기능을 갖춘 middleware 이다
+ Express는 Connect 모듈을 통해 RESTful Web Services를 쉽게 만들게 해주는 Java의 Spring Framework 이다
+ NoSQL
+ 최신버전의 REPL은 V8 engine (Node.js와 동일한 구글의 JavaScript 엔진 사용예정)
+ HA를 위한 쉬운 Replica Set 지원
+ Scale-out을 위한 Replica Set단위의 Sharding 지원
2. Connect 살펴보기
- Node.js에서 모자란 부분을 확장하여 미들웨어 개념으로 제공을 한다.
미들웨어는 단지 펑션일 뿐이고 사용자가 얼마든지 확장하여 사용할 수 있다.
Connect가 HTTP 서비스에 대하여 많은 부분 추상화를 하였고, Express가 Connect를 또 Wrapping 하고 있다
- 출처 : http://www.senchalabs.org/connect/
- logger
+ 아파치의 format string을 생각하면 된다
+ 아파치처럼 %d 와 같은 옵션이 아니라 :date 같은 옵션이다
+ 아파치처럼 다양한 옵션을 제공하진 않는다. %b 와 같이 전송 바이트수 옵션이 없다
- csrf
+ Cross-site request 로 인한 위조 방지
+ _csrf 필드가 hidden으로 추가됨 (req.session._csrf, req.body._csrf, req.query._csrf, req.headers['x-csrf-token'])
- compress
+ gzip 압축지원
+ callback(user, pass) 를 지원하여 true를 리턴하면 접근 허용
+ request body 파싱 및 appplication/json, application/x-www-form-urlencoded, multipart/form-data 파싱
+ Express 에서 사용 : express.bodyParser()
- json
+ JSON 요청 파싱하여 req.body에 파싱한 오브젝트 제공
+ x-www-form-urlencoded 요청 파싱하여 req.body에 파싱한 오브젝트 제공
+ multipart/form-data 요청 파싱하여 req.bodyd와 req.files 에 파싱한 오브젝트 제공
+ connect.multipart({uploadDir: path}) 경로를 설정한다
- timeout
+ 요청에 대한 timeout (ms 단위), 기본 5000 (ms, 즉 5초)
+ err.status=408 이면 next()를 통하여 timeout 응답페이지 처리함
+ 헤더 쿠키를 파싱하여 req.cookies 객체 제공
+ req.secret 스트링 전달 가능
- session
+ session() 사용하려면 cookieParser()를 반드시 사용해야 한다 (세션아이디 sid 저장)
+ req.session 으로 접근
+ SessionStore는 MemoryStore 이고 별도 구현하려면 규정된 몇가지 메소드를 구현하면 됨
세션 클러스터링에 대한 구현이 필요할 수 있겠다
+ 쿠키 사용
+ req.originalMethod 로 form의 method(GET, POST 같은)가 넘어가는 것을 _method로 override
+ X-Response-Time 헤더 표시 (milliseconds)
+ 정적 파일 서비스를 위한 메모리 캐싱. 기본 128 개의 오브젝트 캐싱
+ 각 256k 사이즈로 32mb 까지 캐싱가능
+ Least-Recently-Used (LRU) 알고리즘 사용 : 사용빈도 높은 것이 캐싱
+ respondFormCache() 통하여 캐싱 응답 status=304
- static
+ 루트 경로 지정
+ express.static(__dirname + '/public') 형태로 사용함
+ 주어진 루트 경로의 목록
+ . (dot) 파일은 숨김
- vhost
+ VirtualHost통한 sub domain 설정
- favicon
+ 설정하지 않으면 /public/favicon.ico 찾음
- limit
+ request body 크기 제한
+ 5mb, 200kb, 1gb 등으로 설정
- query
+ query-string을 자동으로 파싱
+ req.query 오브젝트 생성
+ error 처리 핸들러에게 stack traces 제공
+ text or json형태로 에러 메세지 응답
+ /public/error.html 참조
3. 테스트하기
- 테스트는 mocha에 should를 적용하여 BDD 수행한다. (참조)
$ git clone https://github.com/senchalabs/connect.git
Cloning into 'connect'...
remote: Counting objects: 15253, done.
remote: Compressing objects: 100% (4656/4656), done.
remote: Total 15253 (delta 10035), reused 14692 (delta 9538)
Receiving objects: 100% (15253/15253), 3.10
$ cd connect
$ npm install .
$ mocha --reporter list
... 중략 ...
at Server.app (/Users/nulpulum/git-repositories/connect/lib/connect.js:65:37)
at Server.EventEmitter.emit (events.js:99:17)
at HTTPParser.parser.onIncoming (http.js:1928:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
at Socket.socket.ondata (http.js:1825:22)
at TCP.onread (net.js:404:27)
․ connect.urlencoded() should accept a limit option: 2ms
․ connect.urlencoded() should support all http methods: 1ms
․ connect.urlencoded() should parse x-www-form-urlencoded: 1ms
․ utils.uid(len) should generate a uid of the given length: 1ms
․ utils.parseCacheControl(str) should parse Cache-Control: 0ms
․ utils.mime(req) should return the mime-type from Content-Type: 0ms
․ connect.vhost() should route by Host: 2ms
․ connect.vhost() should support http.Servers: 1ms
․ connect.vhost() should support wildcards: 1ms
․ connect.vhost() should 404 unless matched: 2ms
․ connect.vhost() should treat dot as a dot: 1ms
192 tests complete (2 seconds)
- mocha 수행하면 열라 에러 많이 뜬다 ㅠ.ㅠ; 멘붕온다. 해당 메세지가 정상적인 것인지 아닌지 살펴보자
// mocha.opts 내역--require should--require test/support/http
--growl
<참고>
- Express 가이드 한글화 (필독) - Connect의 다양한 Samples in GitHub
- 지난주 부터 수강하고 있는 KOSTA 이복영강사님 강의에서는 제사쿼리를 MongoDB 라고 지칭하였고, 제* 쿼리를 도용하여 내 나름으로 Express & Connect를 하나 더 넣었다
'NodeJS > Concept' 카테고리의 다른 글
[Open API] Apigee.com에서 이야기하는 Open API 원리 (1) | 2013.03.22 |
---|---|
[Node.js] Deview 발표자료를 보고서 느낀점 (0) | 2013.03.14 |
[Node.js] 기술 발전 방향 4단계 (0) | 2013.02.16 |
[Cham] Express, CoffeeScript, Jade, Stylus boilerplate 코드 생성하기 (0) | 2013.01.31 |
[Node.js] 생태계에 대한 생각들 (0) | 2012.12.23 |