일단 링크부터 

https://github.com/facebook/hiphop-php/wiki

입니다.  php 로 시작한 페이스북이 대용량 접속을 처리하기 위해서 php 모듈을 c++ 로 변환해주는 방식을 쓴다고 알려져 있었습니다. 그런데 요즘 페이스북이 베타버젼중인 Node.js 로 갈아탔다고 합니다. 그러더니 자신들이 사용하고 있던 그 라이브러리를 오픈소스화 시켰습니다. (사실 이때쯤 유명해지기 시작했다는 것이 더 사실에 가까울 것입니다) 예전 Scribe 때와 똑같은 현상입니다. 카산드라도 그랬던가? 이건 확실하지 않네요. 

구글은 자신들이 계속 사용할 기술들을 오픈소스화 시키는 반면에 페이스북은 자신들이 더이상 사용하지 않을 기술들을 오픈소스화 시킨다는 느낌이 강합니다.



만약 제가 PHP 사이트를 운영중인 회사의 CTO 고, 그 사이트가 최근 대폭적인 사용자의 증가로 계속해서 하드웨어를 늘리면서 버티고 있는 상황에서 기술을 도입해야 할 고민에 쌓여있다면,  고민에 빠져들만도 합니다. 

hiphop-php 를 써야 하나?
그런데 저는 node.js 로 전 사이트를 리팩토링 하는 방법을 선택할것도 같습니다. 왜냐면 페이스북도 hiphop-php 대신 node.js 를 선택했기 때문이지요.

제가 그래서 공개시점이 항상 애매하다고 생각하는 것입니다. 물론 기술적으로는 문제가 없겠지만, 페이스북이 node.js 를 선택한 시점에서 기술 선택을 해야 한다면 node.js 쪽으로 기울지 않겠습니까? 

제가 이런 막되먹은 생각을 마구 하는 이유는 Scribe 가지고 테스트 하다가 현행화가 안되서 고생한 것 때문에 삐져서 이러는 거 아닙니다 쿨럭.. (그리고 공개는 몇년전에 되어 있더군요 최근 활성화 되기 시작한것이지) 
어쩌다 보니 이메일 보내는 기능을 구현하게 됐습니다. 요즘 서비스 하나 만들려고 보면 이메일 보내기 기능은 거의 기본적인 기능이라 필수적으로 알아야 하는 부분이라고 볼 수 있습니다. 

이 포스트는 두 부분으로 되어 있습니다.

1. SMTP 서버 설정하는 부분
2. Node.js 에서 이메일 보내는 부분



사실 2번은 무지 쉬웠습니다. nodemailer 라는 훌륭한 패키지가 존재하기 때문이지요. 1번은 너무나 쉽고도 오래된 이야기인지 오히려 관련 문구를 찾기가 어려웠습니다. 

개발환경은 역시나 서버 사이드 이기 때문에 Ubuntu 12.10 버젼에서 테스트 했습니다.

1. Sendmail 을 설치해줍니다.

 $ sudo apt-get install sendmail



Postfix 를 요즘 많이 쓴다고 하는데, 귀찮아서 걍 편한 sendmail 을 설치해줬습니다. 처음 설치된 sendmail 은 오로지 Localhost Only 입니다. 사실 이게 편하긴 합니다만, 제 주요 개발 환경은 OSX 이고, 원격에 서버가 설치되어 있는 관계로 sendmail 을 원격에서 접속해서 메일을 보낼 수 있게 설정해 줄 필요가 있습니다.

2. 원격에서 접속할 수 있게 sendmail.mc 를 바꾸어 줍니다.
/etc/mail/sendmail.mc 를 열고 다음줄을 찾아서 바꾸어줍니다.

DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl 


인 부분을

DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=0.0.0.0')dnl


로 바꾸어 줍니다.

아무데서나 접속가능하게 바꾸어 준것입니다. 자 이제 설정파일을 생성해줍니다.

$ sudo bash -c "cd /etc/bash && m4 sendmail.mc > sendmail.cf" 
$ sudo /etc/init.d/sendmail restart



3. 접속 테스트 시작 
원격에서 접속하는 것을 가정으로 하고 sendmail 이 설치된 서버는 편의상 'crazia.super.com' 이라고 하지요. 

$ telnet crazia.super.com 25 

Connected to crazia.super.com
Escape character is '^]'.
220 teemo ESMTP Sendmail 8.14.4/8.14.4/Debian-2ubuntu2; Mon, 18 Mar 2013 11:54:40 +0900; (No UCE/UBE) logging access from: [10.10.10.10](FAIL)-[10.10.10.10]
HELO teemo
250 teemo Hello [10.10.10.10], pleased to meet you
MAIL FROM: crazia@super.com
250 2.1.0 crazia@super.com... Sender ok
RCPT crazia@gmail.com
501 5.5.2 Syntax error in parameters scanning "crazia@gmail.com"
RCPT to: crazia@gmail.com
550 5.7.1 crazia@gmail.com... Relaying denied. IP name lookup failed [10.10.10.10]



붉은색 부분은 제가 실제로 입력해 주는 부분입니다. 

헛 이런 낭패할 때가 !! Relay 가 안된다는 것이군요. 

4. access 에 개발 머신의 아이피를 써주기
/etc/mail/access 파일을 열어서 적당한 곳에

Connect:10.10.10.10                        RELAY



라고 추가해 줍니다. 그리고 3번 테스트를 다시 진행하고  

$ telnet crazia.super.com 25 

Connected to crazia.super.com
Escape character is '^]'.
220 teemo ESMTP Sendmail 8.14.4/8.14.4/Debian-2ubuntu2; Mon, 18 Mar 2013 11:54:40 +0900; (No UCE/UBE) logging access from: [10.10.10.10](FAIL)-[10.10.10.10]
HELO teemo
250 teemo Hello [10.10.10.10], pleased to meet you
MAIL FROM: crazia@super.com
250 2.1.0 crazia@super.com... Sender ok
RCPT TO: crazia@gmail.com
250 2.1.5 crazia@gmail.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: Main from me
It's me !!
.
250 2.0.0 r2I3MdYY028635 Message accepted for delivery
^C
quit

 
이제 정상적으로 메일이 보내지는 것 까지 테스트 되었습니다. 이제 node.js 로 이메일 보내는 방법에 대해서 알아보겠습니다. 

1. nodemailer package 설치하기 
먼저 테스트를 만들 디렉토리를 한개 만들어 주는 것이 좋겠습니다. 

$ mkdir mail-test
$ cd mail-test



그리고 npm 으로 가볍게 인스톨 해줍니다. 

$ npm install nodemailer



2. 실제로 보내는 테스트 코드 작성하기


위 내용을 자신의 상황에 맞게 변경하고 접속 host , 이메일 아이디 (제 아이디 쓰시면 아니되옵니다 ㅎㅎ) 저장합니다. 

3. 실행해보기

$ node mail-test.js



어떻습니까? 참 쉽죠? 

 
node.js 프로그래밍을 할 때, exception 이 발생하면 , 쉴새 없이 Ctrl+C , 화살표 위 (이러면 전에 실행했던 명령줄이 표시됩니다)를 반복적으로 누르는 것을 막아주기 위해서 설치하는 프로그램인 nodemon 이 Ubuntu 계열에서 오동작을 합니다. (하위 디렉토리에서 변경된 것을 잡아채지 못하더군요) 

소스를 뒤져보니 파일의 변경유무를 알아보던 fs.watch 를 이제 안쓰기 때문이라고 하는데요. 그래서 소스 변경 유무를 다음과 같은 명령 형식으로 알아봅니다. (사실 다음 소스는 동작하는 여부인지 골라내는데 사용하는 코드입니다) 

find -L /dev/null -type f -mtime -1s -print

위 명령이  데비안 계열하고 BSD 계열이 다르게 동작하는데 실은 저 명령은 BSD 계열을 기본으로 해서 만들어 진 것입니다. (개발자가 맥빠였던 것입니다!!) 

그래서 우분투에서 개발하시는 분들은 귀찮으시더라도 패치되기 전까지 supervisor 를 사용하시면 됩니다. 사용법은 비슷합니다.  

$ npm install supervisor -g
$ supervisor app.js



편리한 node.js 코딩 되세요. 
 
 node.js 를 이용해서 개발한지가 몇개월 지났습니다. 그동안 언어 배우느라 (자바스크립트를 할 줄 몰랐음) - 사실 언어 자체는 어려울게 하나도 없더군요. - 개발 환경에 익숙해 져야 해서 좀 더 나에게 맞는 편리한 환경을 만들 여력이 없었으나 이제는 어느정도 익숙해 져서 개발 환경쪽에 신경이 쓰이더군요. (사실은 웹일을 하기 싫어서 딴 짓을 하고 있..)

제가 설명드리는 기준은 OSX 입니다. (우분투를 사랑하지만 제 개발 환경은 OSX 라..)

avascript 개발하는데 있어서는 완전 필수입니다. 문법 체크까지 해서 이상한 거는 빨간 밑줄을 그어주더군요. (빨간펜 선생님?!!) 

설치법 입니다. 

$ svn checkout http://js2-mode.googlecode.com/svn/trunk/ js2-mode
$ cd js2-mode
$ emacs --batch -f batch-byte-compile js2-mode.el
$ cp js2-mode.elc ~/.emacs.d/


이러면 설치 끝입니다. 일단 설치만 하고 나중에 설정을 하기로 합니다. 

yasnippet 

TextMate 의 함수 템플릿 기능을 보고 만든 Minor 모드 입니다. 이런 것이 이맥스의 가장 큰 장점입니다. 필요하면 만들면 된다!! 
이것의 사용법은 쉽습니다. 예를 들면 자바스크립트 코딩할 때 함수 선언할 일이 필요하다면 

fun 입력하고 TAB 을 누르면 함수의 템플릿이 자동으로 생성됩니다. 

/**  */
function my_function( args ){
  
}


이런식으로 그러면 함수 설명과 my_function 과 args 부분을 적어주기만 하면 됩니다. 
https://github.com/capitaomorte/yasnippet 여기에 잘 정리가 되어 있습니다. 설치법도 있지만 퍼 와서 보자면 

$ cd ~/.emacs.d/plugins
$ git clone https://github.com/capitaomorte/yasnippet



.emacs 파일의 한 구석에 

(add-to-list 'load-path
              "~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
;; (yas-global-mode 1)    


(yas-global-mode 1) 는 필요할 때만 쓰게 일단은 커멘트 처리 해 둡니다. 


js2-mode 인덴테이션(indentation) 수정 

js2-mode 를 쓰거나 아니면 이클립스에서 개발을 하거나, 가장 문제가 되는 것이 바로 이 인덴테이션이더군요. 정말 그지 같은 인덴테이션 아닌가요? 탭 (tab) 한번 누르면 화면의 1/3 정도 지나쳐서 커서가 위치하는 것을 보면 한숨이 나오더군요. 그런데 역시 세상에는 같은 고민을 가지고 있으면 해결할려고 하는 사람도 있는 법입니다. 


바로 여기 입니다. 여기에 보면 수정하는 방법이 잘 정리가 되어 있습니다. js2-mode 는 이미 설치를 했기 때문에 중간에서 설명하고 있는 에스프레소(espresso) 를 설치해줍니다. (java 가 커피라 그런지 에스프레소 등등의 네이밍들이 요즘 눈에 띄는군요 ㅎㅎ) 


여기서 받아주면 됩니다. 이 모드를 설치해 주는 이유는 인덴테이션이 좋기 때문이라고 글쓴이가 설명하고 있더군요. 참고로 저는 저 파일을 ~/.emacs.d/ 밑에 복사해 뒀습니다. 역시 설치만 하고 설정은 나중에 하는 걸로 합니다. 여기까지 설치가 됐으면 이제 글쓴이가 만든 함수 부분이 기니까 한꺼번에 설정하겠습니다. 

~/.emacs.d/ 에 파일 한개를 만들어 줍니다. (제 경우에는 cr-js.el 이였습니다) 
그러면 cr-js.el 이라고 가정을 하고 다음 과 같은 내용을 추가 해 줍니다. 그리고 다음과 같이 파일은 만들어 줍니다. 



그리고 .emacs 파일에 

(require 'cr-js)


한줄만 추가해 주면 됩니다. 
내친김에 다른 것도 손을 좀 볼까요? 
node.js 에서 웹을 개발할 때 쓰는 view 엔진이 여러개가 있습니다. (정확히는 express) 기본적으로 jade 가 쓰이고요. 디자이너들과 공동 작업을 할 때는 ejs 가 많이 쓰인다고 합니다. ejs 를 쓸때 마땅한 모드가 없더군요. 그런데 ruby on rails 에서 사용하는 rhtml 이 문법이 거의 비슷하더군요. 그래서 rhtml-mode 를 설치해 주기로 합니다. 


요게 다른 모드랑 연계해서 동작하지 않고 독자적으로 rhtml 을 처리하더군요. 맘에 들어서 설치해줬습니다. 

$ cd ~/.emacs.d
$ git clone git://github.com/eschulte/rhtml.git 


그리고 .emacs 에 

(add-to-list 'load-path "~/.emacs.d/rhtml")
(require 'rhtml-mode)

(add-to-list 'auto-mode-alist '("\\.ejs$" . rhtml-mode))
(add-hook 'rhtml-mode-hook
          (lambda ()
            (yas-global-mode 1)))


이렇게 추가해 주면 됩니다. 한가지 이상한 점이 있지요? rhtml 도 yas 모드가 있는지 궁금하실 것입니다. (설정에 보면 있는 것처럼 하는데) 그래서 설치해 주기로 합니다. 


rails 용 snippet 을 모아둔 것들입니다. 당장은 rails 개발을 안할꺼기 때문에 rhtml 용만 떼어 오기로 합니다. 

$ cd ~/
$ mkdir temp
$ cd temp
$ git clone git://github.com/eschulte/yasnippets-rails.git
$ cd yasnippet-rails 
$ cd rails-snippets
$ cp -r rhtml-mode ~/.emacs.d/plugins/yasnippet/snippets/


이렇게 해주면 snippet 이 설치가 됩니다. 이제 편하게 코딩을 하시면 됩니다. 

ps.

js2-mode 용 snippet 도 설치를 하셨다면 node.js 에서 자주 쓰이는 prototype method 선언하는 템플릿을 만들어 두면 편합니다. 제가 만들어 쓰는 것을 공개합니다. 

# -*- mode: snippet -*-
# name: protf
# contributor: Wolfgang crazia <crazia@gmail.com>
# --
/** $1 */
${2:my_class}.prototype.${3:method_name} = function ( ${4:args} ){
    $0
}


이 파일 이름을 (확장자 없이) protf 로 만들고 

~/.emacs.d/plugins/yasnippet/snippets/js2-mode/protf 


로 저장하면 나중에 자바스크립트 파일 편집중에 protf 라고 입력하고 탭 (tab)키를 누르시면 자동으로 템플릿이 완성됩니다. 



    - 초간단 요약 -
    기존의 자바 서비스하고 있던 부분의 일부를 node.js 로 포팅해서 두개를 벤치마크 해 봄. 자바는 멀티코어 환경에서 테스트하고 node.js 는 cluster 를 안쓰고 단일 코어에서 (아무것도 안하면 단일코어에서 도니 ㅎㅎ) 동작시켜봄 결과는 아래와 같음 



    씨피유와 메모리는 적게 쓰지만 (훨씬 적게..) 성능은 그리 낫지 않음. 이거저거 바꿔가며 테스트를 하던중 ORM 을 지원하는 Sequelizer 가 느리다는 것을 알아냄, node-mysql 로 바꾸고 나니 바뀐 내용입니다.



단일 코어를 씀에도 불구하고 자바와 비슷하게 성능이 나오고 있습니다. 같은 하드웨어라 가정하면 node.js 에 클러스터 (cluster)를 적용한다고 한다면 자바의 거의 5배에 해당하는 효율을 보일 것으로 예상됩니다. 

   글쓴이가 올린 다음 글을 보면 , node.js 는 성능이 워낙 뛰어나고, 여러사람들이 참여하기 때문에 무섭게 성장하는 개발환경이 될것이기 때문에 주의깊게 보고 있기는 하나, 기업용으로 쓰기에는 아직 치명적인 약점이 있다고 합니다. 바로 node.js 자체의 개발 주기가 너무 짧기 때문에 오랜 기간을 개발해야 하는 기업용 환경에서는 좋지 않다는 것입니다. (개발 하는 중간에 메인 언어가 업데이트 된다고 생각해 보세요 ㅎㅎ) 그렇기 때문에 1.xx 대로 올라가서 안정화가 된다면 그 때부터 기업용으로 쓰기에 무리 없지 않을까 라고 본답니다. 물론 저자는 아주 만족한 거 같다고 하더군요. 

  저도 글쓴이의 의견에 어느정도 동의합니다. 다만 지금 버젼으로도 정말 기업용 커다란 사이트가 아닌, 간단한 기능을 제공하는 사이트를 제작하는 데에는 (특히나 App 서버로) 최고의 효율을 보이지 않을까 싶습니다. 

Express (Node.js의 웹 프레임 워크) 에서의 Middleware 개념은 쉽게 설명하자면 Java 에서의 Filter 와 비슷한 개념입니다. 자주 쓰이고 통념적으로 쓰이는 행위들을 미리 걸러주는 역할을 한다고 볼 수 있습니다.  

예로 들면 express 가 내부적으로 쓰고 있는 formidable 은 HTTP의 request 를 정리하는데 탁월합니다. 그러나 개발자가 매번 formidable 을 불러서 정리하는 것이 번거로울 수가 있기 때문에 이를 middleware 로 만들어서 

   app.use(express.bodyParser());


이런식으로 선언만 해두면 사용이 되는 것입니다. (내부적으로 formidable 이 쓰이고 있음. ) 

이런 미들웨어를 만드는 법이 찾아보진 않았지만 예제가 많지는 않습니다. (너무 쉬워서 그럴 수도..)


다행히 위 링크에 가면 fineuploader 가 올리는 xhr 방식의 asynchronous 데이타 전송을 잡아채서 req.files 에 정리하는 부분을 미들웨어로 구현한 소스가 있습니다. 비록 옛날 소스이긴 하지만 (요즘 express 가 너무 많이 발전을 한 관계로..) 어떻게 미들웨어를 만드는지 참조하시면 좋을 듯합니다. 



글을 퍼올 수가 없어서 어쩔 수 없이 제 gist 에 올렸습니다. 원문은 위에 링크되어 있는 주소로 가면 나옵니다. (동작하는지에 대한 보장은 해 드릴 수 없습니다) 

(req, res, next) 로 이루어진 전형적인 미들웨어형 함수 선언이 보입니다. 위 사이트를 가면 어떻게 npm 패키지를 만드는 지에 관한 방법도 감을 잡으실 수가 있을 것입니다. 
Node.js express 를 이용해서 개발하다 보면 아쉬운 것이 한가지 있습니다. 본의 아니게 서버가 죽어버리는 일입니다. 물론 이런일이 발생하지 않게 에러 핸들링을 속된 말로 빡세게 해야 하지만 뭐 어떻게 알아서 그걸 다 하고 있습니까... (후다다다닥) 

만약 서버가 죽는다고 하더라도 우아하게 재시작 된다면 (gracefully restart 라는 표현을 쓰더군요) 추후에 비슷한 에러가 발생하지 않도록 조치를 취해줄 수가 있습니다.  

역시나 설치법은 무지 쉽습니다. npm 이 설치되어 있다고 가정한다면

$ sudo npm install forever -g 



이러면 설치되고, 원하는 스크립트 서버를 띄워주고 싶다면

$ forever start app.js


하면 데몬 형식으로 구동됩니다. 아! 로그도 봐야 하지요?

$ forever logs



하면 현재 띄워져 있는 스크립트랑 거기에 관한 로그에 대한 내역이 나옵니다.  내용을 보고 싶다면 , 예를 들어 한개의 스크립트 서버를 띄웠다고 가정한다면

$ forever logs 0



하면 tail 로 로그를 뒤지는 효과가 나옵니다. 자세한 설명은 원문을 찾아보시면 됩니다.

원문링크 : https://github.com/nodejitsu/forever 
푸시 기능 구현을 Node.js 에서 하기에는 너무 쉬운 관계로.. 안드로이드 쪽부터 보기로 하겠습니다. 
안드로이드는 실 기계에서 작업하지 않는 한 에뮬레이터에서 푸시 기능을 테스트 해 보기 위해서는 Google API 를 지원해야 합니다.

Android SDK Manager (Windows 메뉴에 보면 있습니다. OSX 기준) 를 실행시키고 화면을 보면 


Android 4.2 (API 17) 에 'Google APIs' 가 설치 되어 있어야 합니다. 만약 설치 안되어 있다면 체크박스에 체크 하고 설치해주시면 됩니다. 

Google API 가 설치되어 있는 형태의 '가상 기계'를 구동하셔야 푸시 이벤트 처리가 가능합니다. 

Android Virtual Device Manager 를 실행시킵니다. (역시 Windows 메뉴에 있습니다) 
그리고 새로 '가상 기계'를 설정해 주는데 OS 버젼 골라주는 곳? 그곳에서 Google API 라고 쓰여져 있는 버젼을 골라주면 됩니다. 


자 제것의 화면입니다. 같은 4.2 버젼이지만 Google API 를 쓰느냐 안 쓰느냐의 차이만 존재합니다. 

그리고 다시 Android SDK Manager 를 실행시켜줍니다.

 
위에 보이는 라이브러리를 설치해줍니다. 자 그러고 나면 

$SDK/extras/google/gcm/ 밑에 보면 프로젝트들이 설치되어 있습니다. 그중에서 samples 밑의 gcm-demo-client 를 주목해야 합니다.  (본인의 경우에는 /Users/crazia/work/android/sdk/extras/google/gcm/samples/gcm-demo-client 에 설치되어 있습니다. )

Eclipse 가 이미 구동되어 있을 테니 (안 그러면 SDK 메니져랑 가상 기계 매니져를 실행시킬 수 없었겠지요?) 위에 지정한 프로젝트를 Import 해옵니다. 

자 이제 안드로이드 쪽에서 해야 할일의 90% 는 끝이 난 셈입니다. 이제 키가 두개 필요합니다. 편의상 Project Key (SEND ID) 와 API Key 라고 부르겠습니다. 각각 클라이언트와 서버쪽에서 필요한 키입니다. 

https://code.google.com/apis/console 에 접속하셔서 


아직 등록이 안되어 있다면 'Create Project' 를 누르시면 프로젝트가 생성됩니다. 그리고 나면 URL 이 자동으로 변경이 되는데. 

https://code.google.com/apis/console/#project:4815162342

여기서 보이는 저 굵은 글자가 바로 Project Key 입니다. (SEND ID) 아이템을 얻었습니다!!

왼쪽에 탭을 보면 여러가지 메뉴가 있는데 그중에 

"Services." 탭을 선택합니다. 
"Google Cloud Messaging" 을 ON 으로 토글링 합니다. (켭니다) 


이제 구글 클라우드 메시지 서비스를 이용하기로 결정이 됐습니다. 
자 다시 왼쪽 탭을 보면 그중에서 

"API Access" 탭을 선택합니다. 
아래쪽에 보면 "Create New Server Key" 라는 버튼이 있습니다. 
보내고 싶은 IP 리스트에 대한 리스트를 작성해 주고 싶으면 작성하고 마땅히 할게 없으면 "Create" 버튼을 눌러줍니다. 



이제 중간에 나오는 화면에서 "API Key" 부분에 나와 있는 키를 따로 떼서 저장합니다. (Server Key) 아이템을 얻었습니다!!

중간 점검을 하자면 

1. Google API 를 지원할 수 있게 Virtual Device 를 생성하는 준비를 마쳤습니다. 
2. Extra/gcm 샘플 소스를 받아서 Eclipse 에서 쓸 수 있게 Import 했습니다. 
3. Sender ID 와 Server Key 로 사용할 수 있는 Project Number 와 API Key 를 받았습니다. 

여기까지 완수가 되었다면 이제 클라이언트 (Android) 쪽 코딩을 마무리 지어 봅니다. Eclipse 의 프로젝트에 포함된 파일중에서 CommonUtilities.java 파일을 열어줍니다. 

    /**

     * Base URL of the Demo Server (such as http://my_host:8080/gcm-demo)

     */

    static final String SERVER_URL = "http://192.168.0.36:3000";
    // node.js 서버가 기다리고 있는 주소와 포트를 적어 주는 것입니다. 


    /**

     * Google API project id registered to use GCM.

     */

    static final String SENDER_ID = "4815162342";
    // 위에서 얻은 Project Number 를 입력해 줍니다.

이로서 클라이언트 부분은 끝이 났습니다. 이제야 제일 핵심인 Node.js 에서의 푸시 기능 구현에 들어가겠습니다.

$ cd $PROJECT_DIRECTORY
npm install node-gcm --save

-- save 옵션을 package.json 에 해당 사항을 기입하라는 뜻입니다.  

app.js 를 열어서 다음과 같이 추가 해 줍니다. 

var main = require('main');

app.post('/register', main.regist);
app.get('/send', main.send_push);


main.js 파일을 하나 만들어서 열고 

exports.regist = function (req, res) {

console.log (req.param('regId'));
        // 원래는 DB 에 저장하는 부분이 있어야 할 것입니다. 받아서 디비에 저장하기       

res.end(); 


exports.send_push = function(req, res) {

var message = new gcm.Message();

var sender = new gcm.Sender('API Key 를 입력하는 곳입니다. ');

var registrationIds = [];


// Optional

message.addData('key1','message1');

message.addData('key2','message2');

message.collapseKey = 'demo';

message.delayWhileIdle = true;

message.timeToLive = 3;


// At least one required

registrationIds.push('이곳은 register 함수에서 받은 regId 를 입력하는 부분입니다.');
        // 만약 제대로 구현 됐다면 디비에서 읽어서 가져오겠지요?  

        

/**

 * Parameters: message-literal, registrationIds-array, No. of retries, callback-function

 */

sender.send(message, registrationIds, 4, function (err, result) {

    console.log(result);

});

// sender.sendNoRetry(message, registrationIds-array, function (err, result) {

//     console.log(result);

// }); // retry 없이 보내는 부분입니다. 보통은 이것을 더 많이 애용할 것 같습니다. 

}




너무 쉽게 끝났지요? 이게 node.js 의 힘이라고 볼 수 있습니다. 자신의 안드로이드 프로젝트에 기능을 추가하고 싶으시다면 참조 사이트를 참조하시면 됩니다. 

참조  사이트 

https://github.com/ToothlessGear/node-gcm : node.js 에 gcm 모듈 구현 
http://developer.android.com/google/gcm/gs.html : 구글의  gcm 모듈 구현하는 설명 페이지 (완전 중요!!)


 
두번째 게시물  (게시판 형식으로 변경)
첫번째 게시물  (뼈대를 만들고)

Node.js 를 이용해서 열악한 하드웨어 스펙으로도 많은 사용자를 접속 처리를 하며, MongoDB 를 이용해서 엄청난 수의 게시물도 소화가 가능한 말 그대로의 대용량 게시판에 대한 개인 작업입니다.  

프로젝트 페이지는 https://github.com/crazia/nodejs-mongodb 입니다.  천천히 천천히 작업중이라 진도가 느리지만 이번 커밋 내용은 소스에 대한 간단한 리팩토링과 README 파일 수정입니다.

다음에는 시나리오에 맞게 회원가입을 만들어 볼 예정입니다.

 
앞으로 시절이 시절인 만큼, 공공 게시판에서 다양하게 의견을 주고 받을 수 없는 시절이 다가 올 수도 있습니다. 그래서 뜻이 맞는 사람들 (동지? ㅎㅎ) 끼리 모여서 이야기 할 수 있는 동호회 스러운 느낌의 게시판들이 성행할 수도 있습니다. 

포탈은 어떻게든 내용이 새어나갈 수 있지만 , 이런 동호회 기반의 커뮤니티는 그런 염려가 없습니다. 저도 하나 가입해 있어서 어려울 때 심심찮은 위로가 됩니다. 그런데 그런 작은 규모의 게시판일 때는 제로보드가 문제 없이 동작하나 사람들의 접속이 많아지면 많아질 수록 힘들어 하는 것이 느껴집니다. 따라서 다수의 접속을 처리할 수 있도록 최근 뜨겁게 인기를 끌고 있는 event-driven 방식의 웹서비스가 필요하지 않을까 해서 만들어본 기초 프로젝트 입니다. 

당연히 뼈대(skeleton)뿐 입니다. 완성도 있는 게시판들과 비교할 수가 없지만 앞으로 만들어 나갈려고 생각중입니다. 친구들 몇도 가입해서 개발할 준비가 되어 있습니다.

나중에 엄청 게시판이 흥했을 때 갖춰질 미래 예상도 입니다.

 
수평적으로 확장이 가능한 것이 특징이라고 할 수 있겠습니다. 현재는 간단한 글을 생성하고 볼 수 있습니다. (CR 만 가능합니다. UD 는 안됨 ㅎㅎ) 게다가 디자인은 형편 없습니다. 제가 워낙 미적 감각이 떨어지다 보니 게시판 에디터로는 CKEditor 를 붙였습니다.  이미지 업로드 까지 처리해 둔 상태입니다. 

소스는 https://github.com/crazia/nodejs-mongodb 여기에 올려뒀습니다. 

$ git clone git://github.com/crazia/nodejs-mongodb.git
$ cd nodejs-mongodb
$ npm install -d
$ node app.js



하시면 실제로 동작하는 것을 볼 수가 있습니다. node.js 나 npm 설치나, mongodb , redis 관련 설치법은 제 예전 블로그를 뒤져보시면 많이 나옵니다.

이글 참조

+ Recent posts