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

Publication

Category

Recent Post

완벽한 자바스크립트 아키텍쳐는 어떻게 구성되는지를 NodeJS, Google Chrome Extention, MongoDB를 통하여 알아보자


1) 역할

  - NodeJS : 서버 측면, 실시간 연결을 장시간 유지하기 위하여 Socket.io 사용한다

  - Google Chrome Extention : 클라이언트 측면, WebSocket, Notification과 Local Storage가 사용된다

  - MongoDB : 데이터를 저장한다 



2) 아키텍쳐

  - 트윗을 추적하여 실시간으로 클라이언트에게 브로드케스팅 한다

  - 클라이언트 "What's Next"는 Google Chrom browser extension 이다 (크롬 애플리케이션)

  - HTML5의 기능을 사용한다 

  - MongoDB에 트윗 내역을 저장하고 이벤트가 끝나면 통계를 생성한다 

  


3) Node 아키텍쳐

  - V8 JavaScrpt engine 기반의 서버사이드 애플리케이션 개발을 위한 오픈소스 툴킷이다 

  - Node 기반 API는 CommonJS 모듈 시스템을 사용하여 확장한다

  - 2009년 2월 라이언 일병 (Ryan Dahl)이 만들었고, Python의 Twisted나 Ruby의 EventMachine과 유사하다 

  - Joyent에서 no.de Node.js 호스팅 준비하면 진행하고 있다


      



4) Node의 목적

  - 쉽고 안전한 방법으로 고성능이며 확장가능한 네트워크 프로그램을 JavaScript로 만드는 것이 목적이다 

  - 목적을 위하여 취한 아키텍쳐 

    + Single Threaded : Apache 처럼 각 요청마다 thread를 띄우지 않는다

       > 단일 스레드를 사용함으로 CPU context switching일 피할 수 있다

       > 메모리상에 대량의 실행 컨텍스트를(Execution Context) 두지 않아도 된다

    + Event Loop : Marc Lehman 씨가 libev 라이브러를 C++로 작성한 것을 이용함

       > 이벤트 루프는 확장가능한 이벤트 알림 메커니즘(scalable event notification)을 위하여 epool 또는 kqueue를 사용한다 

    + Noe blocking I/O : Marc lehmann 씨가 libeio 라이브러를 작성한 것을 이용함 

       > input 또는 output response에 대해서 (예로 database, file system, web service등) 기다리면서 CPU time losss를 피한다

    

  - 위 특징들로 인해 Node는 thread에 자유로우면서 대량의 트래픽을 처리할 수 있게 한다 

  - 대부분의 프로토콜에(TCP, DNS, HTTP) 대해서 이미 내장되어 지원한다

  - 모든 I/O 관련 function 수행은 callback을 사용해야 한다 

  - Event Driven 언어인 JavaScript는 Node의 'Event Loop' 방식 개발에 적합하고, 익명함수/클로져 같은 자바스크립강점을 이용

  - 참조 PDF

  - GitHub에서 가장 인기있는 OSS 목록

  - 설치는 사이트에서 다운로드 또는 http://nodejs.org/dist 목록 파일 버전을 선택에서 wget등 여러 방법으로 설치함 



5) Node 서버 만들기 

  - Node 단순 서버 만들기


  - Socket.io 단순 서버 만들기


  - http server에 socket.io 모듈을 붙여서 기능을 첨부하는 것이다. 

    + a = b  대입연산의 변환  b(a) funcational로 표현됨 (functional lanuage는 assignment 즉, 대입문이 필요없다

    + 대입문이 없으므로 대입변수를(variable) 메모리에 생성할 필요가 없이 function이 state를 안가진다. (참조)

  - http.createSever()에서 callback function을 제거했으므로 client 요청에 대한 처리를 하지 않고

     대신 이벤트가 발생하면 데이터를 바로 push 한다

  - socket.io에 callback을 넣으면 클라이언트 요청을 처리한다 

var socket = io.listen(server, function(client) { ... new client connection ... } );



6) 트위터 추적 모듈 만들기

  - Twitter Streaming API를 사용해서 "What's Next" 이벤트 틔윗을 받는다

  - API는 설정 메션에 대한 모든 트윗을 전달해 준다 

  - Twitter API 연결 -> 새로운 트윗 발견시 매번 이벤트 발생을 모듈로 만든다 


7) 트위터 추적하기 

  - Basic Authorization을 사용모듈


8) Twitter OAuth 설정하기 

  - 원문의 Basic Authorization을 사용하지 않고(2010.8.31 종료됨) OAuth를 사용한다

  - OAuth 모듈을 설치한다 

$ npm install oauth

npm http GET https://registry.npmjs.org/oauth

npm http 200 https://registry.npmjs.org/oauth

npm http GET https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz

npm http 200 https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz

oauth@0.9.8 node_modules\oauth

  - https://dev.twitter.com/ 에 로그인하여서 Consumer Key, Request Token, Access Token을 만든다

  - OAuth를 적용한 코드를 다시 만들어 보자 (실천과제)



<참조>

  - 원문 : A Full Javascript Architecture, Part One - NodeJS

  - Twitter OAuth 설명글

  - Node.js + Express로 Twitter 보기

  - Twitter OAuth with node-oauth for node.js+express


posted by 윤영식