블로그 이미지
윤영식
Full Stacker, Application Architecter, KnowHow Dispenser and Bike Rider

Publication

Category

Recent Post

2013. 3. 11. 11:51 NodeJS/Concept

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)

    + Modern Web App 개발


  - 제사 쿼리 : Express & Connect 

    + Server MV* Framework

    + Node.js가 Java의 JVM 이라면 Connect 는 Java의 WAS(Web Application Server) or Apache 기능을 갖춘 middleware 이다

    + Express는 Connect 모듈을 통해 RESTful Web Services를 쉽게 만들게 해주는 Java의 Spring Framework 이다 


  - 제오 쿼리 : MongoDB

    + 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 압축지원


  - basicAuth

    + callback(user, pass) 를 지원하여 true를 리턴하면 접근 허용


  - bodyParser

    + request body 파싱 및 appplication/json, application/x-www-form-urlencoded, multipart/form-data 파싱 

    + Express 에서 사용 : express.bodyParser()


  - json

    + JSON 요청 파싱하여 req.body에 파싱한 오브젝트 제공


  - urlencoded

    + x-www-form-urlencoded 요청 파싱하여 req.body에 파싱한 오브젝트 제공


  - multipart

    + multipart/form-data 요청 파싱하여 req.bodyd와 req.files 에 파싱한 오브젝트 제공

    + connect.multipart({uploadDir: path}) 경로를 설정한다 


  - timeout

    + 요청에 대한 timeout (ms 단위), 기본 5000 (ms, 즉 5초)

    + err.status=408 이면 next()를 통하여 timeout 응답페이지 처리함 


  - cookieParser

    + 헤더 쿠키를 파싱하여 req.cookies 객체 제공

    +  req.secret  스트링 전달 가능 


  - session

    + session() 사용하려면 cookieParser()를 반드시 사용해야 한다 (세션아이디 sid 저장)

    + req.session 으로 접근 

    + SessionStore는 MemoryStore 이고 별도 구현하려면 규정된 몇가지 메소드를 구현하면 됨 

       세션 클러스터링에 대한 구현이 필요할 수 있겠다 


  - cookieSession

    + 쿠키 사용 


  - methodOverride

    + req.originalMethod 로 form의  method(GET, POST 같은)가 넘어가는 것을 _method로 override

 

  - responseTime

    + X-Response-Time 헤더 표시 (milliseconds)


  - staticCache

    + 정적 파일 서비스를 위한 메모리 캐싱. 기본 128 개의 오브젝트 캐싱

    + 각 256k 사이즈로 32mb 까지 캐싱가능 

    + Least-Recently-Used (LRU) 알고리즘 사용 : 사용빈도 높은 것이 캐싱

    + respondFormCache() 통하여 캐싱 응답 status=304


  - static 

    + 루트 경로 지정

    + express.static(__dirname + '/public') 형태로 사용함 


  - directory

    + 주어진 루트 경로의 목록

    + . (dot) 파일은 숨김


  - vhost

    + VirtualHost통한 sub domain 설정


  - favicon

    + 설정하지 않으면 /public/favicon.ico 찾음 


  - limit 

    + request body 크기 제한  

    + 5mb, 200kb, 1gb 등으로 설정


  - query

    + query-string을 자동으로 파싱

    + req.query 오브젝트 생성


  - errorHandler

    + error 처리 핸들러에게 stack traces 제공

    + text or json형태로 에러 메세지 응답 

    + /public/error.html 참조



3. 테스트하기 

  - GitHub connect Test Doc

  - GitHub connect Test Source

  - 테스트는 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


  - connect의 Code Coverage 보기 



<참고>

  - Express 가이드 한글화 (필독)

  - Connect의 다양한 Samples in GitHub

  - 지난주 부터 수강하고 있는 KOSTA 이복영강사님 강의에서는 제사쿼리를 MongoDB 라고 지칭하였고, 제* 쿼리를 도용하여 내 나름으로 Express & Connect를 하나 더 넣었다

  - Connect 개념 설명 및 간단 예제

  - JavaScript Code Coverage 프레임워크


posted by 윤영식