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

포탈은 어떻게든 내용이 새어나갈 수 있지만 , 이런 동호회 기반의 커뮤니티는 그런 염려가 없습니다. 저도 하나 가입해 있어서 어려울 때 심심찮은 위로가 됩니다. 그런데 그런 작은 규모의 게시판일 때는 제로보드가 문제 없이 동작하나 사람들의 접속이 많아지면 많아질 수록 힘들어 하는 것이 느껴집니다. 따라서 다수의 접속을 처리할 수 있도록 최근 뜨겁게 인기를 끌고 있는 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 관련 설치법은 제 예전 블로그를 뒤져보시면 많이 나옵니다.

이글 참조
이 질문에 대한 답변중에 공감이 가는 것을 http://stackoverflow.com/ 에서 봤습니다. 

Dive and Swim

이 그 답변이였습니다. 최근에 저도 새로운 무엇인가를 배우기 위해서 거의 일년 가까운 시간을 소비했습니다. 물론 그것만 한 것은 아니지만 차근 차근 공부할려고 정말 많은 시간을 투자 했는데 , 최근 일주일간 재미 있어 보이는 것을 만들어 볼려고 직접 만들어 본 것보다는 떨어지는 것 같습니다. 

이래서 직접 경험해 보는 것보다 훌륭한 공부는 없다고 하나 봅니다. 아이디어보다 실천이 중요하듯이 공부도 실전을 병행해서 해보는 것이 훨씬 중요합니다. (입롤 백번 해봐야 실제로 한번 해보는 것보다 떨어집니다 ㅎㅎ) 

ps.
 프로그래밍 언어에 관한 이야기 지만, 외국어도 별로 다르지 않겠지요?  

What is this? 가 이것은 무엇인가요가 아닌  this 란 무엇인가요? 라는 말 장난을 쳐 둔 포스트의 내용이 있습니다. 



객체지향 프로그래밍 (Object Oriented Programming) 언어에 보면 this 라는 애가 등장합니다. 여기서의 this 는 간단해서 Object 자신을 가르키고 있습니다. 

다만 Javascript 의 this 는 이와 달라서 class 내에 선언된다고 해도 꼭 그 class 객체를 지정하지는 않습니다. 이 알송 달송한 javascript 의 this 를 체계적으로 잘 설명한 글 입니다.


왠만하면 번역을 해서 편하게 설명할 까 했는데 너무 양이 많아서 엄두가 나지 않는군요 ㅎㅎ;; 대신 결론 부분만 조금 언급을 하자면 this 는 실행 범위 (scope) 의 영향을 받는 다는 것입니다. 

1. 새로운 실행범위를 만드는 유일한 길은 function 키워드를 이용해서 입니다. 

2. var 용법은 현재 범위에만 통용되는 변수를 만들게 해줍니다. 만약 local 범위에서 var 를 이용해서 변수를 만든다면 그 변수는 외부에서 선언된 같은 이름의 변수를 덮어버립니다. 

3. this 와 argument 를 제외한 모든 변수들은 lexical 범위를 따릅니다. (이 뜻이 뭔고하니 함수나 파일 안 같은 물리적인 범위를 말합니다)

4. this 와 argument 는 (일반적인 OOP 와는 다르게) 각각의 불려지는 Context 환경에 따라 다릅니다. 얘네들을 클로져 (closure) 안에 포함시키고 싶다면 참조 (reference) 시키는 코드를 작성해야 합니다. 

5. this 의 값은 함수가 어떻게 불려지느냐에 따라 정의됩니다. 이것을 조절하고 싶다면 call 이나 apply 를 이횽해야 합니다. 


만약 OOP 에서 사용되는 this 의 용법을 구현하려고 하면 좀 복잡한 방법을 써야 한다고 합니다. 그런데 그렇게 구현하는 방법을 고심할 바에는 javascript 의 문법에 익숙해지는 것이 낫다는 충고를 줍니다.

자세한 내용은 본문에 예제와 함께 잘 정리되어 있습니다. 

아직도 외국 리스퍼들 이나 커뮤니티에 가보면 Windows 에서 Lisp 개발 환경 꾸미느라 고생한다는 글이 종종 보이곤 합니다. 

예전에 Weblock 프로젝트 개발 환경을 Windows 에서 구현하는 것이 의미 있다고 생각해서 정말 열심히 노력해서 8시간만에 세팅한 적이 있었습니다. 뭔가 모잘란 듯 하지만 잘 구성되서 만족하며 썼었습니다. 

그 후로 잠시 잊고 있다가 , 다시 같은 개발 환경을 Ubuntu 에서 할 경우가 있었습니다. (CentOS 가 아닌 Ubuntu 입니다). 3분 걸리더군요..

8시간대 3분 , 게다가 8시간짜리 환경은 완벽한 환경도 아니였습니다. SBCL 윈도우즈 버젼은 그 때 당시에는 쓰레드 지원이 안됐습니다.

제대로 되지도 않는 개발 환경을 세팅한다고 8시간을 허비해야 할 가치가 있는 것일까요?  차라리 그 시간에 버추얼 데스크탑을 설치하고 거기다 우분투를 설치하는 시간이 더 빠를듯합니다. 한시간 안쪽에 모든 개발 환경이 설정 될 것입니다. 

ps.
 물론 이렇게 이야기 하지만 Emacs 환경 설정에는 특별히 공을 들이곤 합니다. 없는 기능이면 친절하게 코딩까지 다 해가면서 ㅎㅎ  
전통적인 프로그래밍 언어들에 있어서 프로그래밍 방식이란 순차적으로 실행되는 형식을 취합니다. 쉽게  말해서 

var a = FunctionA () ; // 10 초 걸림
var b = FunctionB () ; // FunctionA 가 실행된지 10초 후에 실행됨 


이러한 방식으로 앞에 실행된 것(FunctionA)이 완벽하게 끝나야지만 다음 것(FunctionB)이 실행됩니다.
너무나 당연한가요? 사실 순차적으로 실행되는 것은 Node.js 에서도 일반적인 방식입니다. 다만 약간의 차이가 있을 뿐입니다. 

Node.js 에서 위 함수가 실행되는 방식을 알아보기로 할까요? 

var a = FunctionA () ; // 10 초 걸림
var b = FunctionB () ; // FunctionA 가 실행된후 바로 실행됨 


FunctionA 는 실행이 완료되기 까지 10초가 걸리지만 바로 리턴됩니다. (어딘가에서는 실행이 계속 되고 있겠지요?) 그리고 FunctionB 가 바로 실행이 됩니다. 

이렇게 실행되는 방식이 Asynchronous 하게 실행된다고 합니다. 또 이렇게 실행되는 이유는 Node.js 가  Event-Driven 방식이기 때문입니다. 

여기서 잠깐..

 
만약 전통적인 프로그래밍 방식에서 FunctionA 와 FunctionB 가 동시적으로 실행되게 할려면 어떻게 할까요? Thread 프로그래밍을 통해서 두 함수가 동시적으로 실행되게 할수 있습니다. 

반면 실행 자체가 Event-Driven 이어서 Asynchronous 하게 실행이 되지만 Node.js 에서는 Concurrency 문제가 없습니다. (Lock/Mutex 개념을 신경 쓸 필요가 없습니다)


그러면 Node.js 에서 Synchronous 하게 실행하려면 어떻게 해야 할까요? 즉 FunctionA 가 실행이 완료된 후에 FunctionB 가 실행이 되게 할려면? 

이래서 CallBack 이라는 개념이 등장합니다. 제 기억에서 콜백(Callback) 개념은 윈도우 프로그램을 할 때 등장합니다. OS 가 불러주는 개념으로 배웠었는데 여기에서는 어떤 단위함수가 작업을 끝마치고 불러주는 개념으로 통합니다. 

Node.js 의 Asynchronous 형식의 함수들은 100% Callback 함수를 인자로 받아들이게 되어 있습니다. 

FunctionA ( FunctionB ()); // 10초 걸림
var c = FunctionC () ;


이런 형식으로 부르게 됩니다. 위 코드는 FunctionA 를 실행하고 바로 리턴되서 FunctionC 를 실행합니다. 그리고10초 있다가 (FunctionA 가 끝날 때 까지 걸리는 시간) FunctionB 가 실행됩니다. 

이게 일반적인 Node.js 의 Asynchronous 방식입니다. 

그러면 끝으로 Node.js 에서 Synchronous 형식으로 되어 있는 함수와 Asynchronous 형식으로 되어 있는 함수의 차이를 살펴보고 리턴값을 어떻게 처리하는 지 살펴보겠습니다. 중요한 부분이라 꼭 이해하고 넘어가야 합니다. 

fs.readFile(filename, [callback]);

이라는 함수가 있습니다. 파일 이름과 callback 함수를 인자로 받습니다. Asynchronous 함수입니다. callback 을 받으니 당연하겠지만, 그리고 non-blocking 함수 입니다. 이 말인 즉슨 실행하고  바로 리턴한다는 뜻입니다. 

fs.readFileSync(filename);


이라는 함수가 있습니다. Asynchronous 함수에 Sync 가 붙어 있고 callback 함수를 인자로 받아들이지 않습니다. Synchronous 함수란 뜻입니다. 그리고 함수가 다 실행될 때까지 다음 것이 실행되지 않으니 blocking 함수입니다.

Synchronous 함수는 결과를 리턴합니다. 

var data = fs.readFileSync('/etc/passwd');


반면 Asynchronous 함수는 결과를 Callback 함수에게 넘겨 줍니다. 

fs.readFile('/etc/passwd' , function(err, data) { .. });


Sync 방식의 함수에서의 Return 값인 data 가 Async 방식에서는 Callback 함수의 인자로 넘겨지는 것을 확인할 수가 있습니다. 

이런 방식이 주는 혼란점은 나중에 다뤄 보기로 하겠습니다. 



지금 하고 있는 간단한 App 서버를 만들기 위해서 Node.js 를 사용해 보고 있는 중입니다. 빠르고 간단하고 아주 쉽게 App 서버를 만들 수 있는 강력한 툴이지만, 조금만 깊이 들어가면 골치 아픈 구조더군요. 

Async Hell 이라고 불리는 CallBack 이 CallBack 을  부르고 , 또 부르고 부르고 부르고.. 한 5단계 내려가게 되면 환장하겠더군요 

지금까지 제가 익숙하게 다뤄온 언어들이 대부분 Event-Driven 방식이 아니라서 그런지 적응하는데 시간이 좀 걸릴거 같습니다.

 
몇년전에 ROR (Ruby on Rails)이 이슈화 될때의 유명한 ScreenCast 가 생각납니다. '15분만에 블로그' 만들기 였는데, 그 뒤로 새로운 언어나, 새로운 웹프레임워크의 강력함을 설명하기 위해서 항상 블로그를 얼마만큼 빠르게 만들어 낼 수 있는가가 그 척도가 되는 듯 합니다. 

Node.js
도 예외는 아닌듯 싶은데, 실제로도 빠르게 만들어 볼 수가 있으며, 사용하는 사람에게 프로그램을 짜는 즐거움까지 전달합니다. 

제가 예전에 정리한 포스트 에서 마지막에 실전 예제라고 소개하는 직접 블로그 만들기에 관한
 예제입니다. 소스가 예전 버젼에 맞춰져 있기 때문에 현행화를 조금 거쳤습니다. 

환경
    

    OSX Mountain Lion 
    Node.js v0.8.14 
    express 3.0.1
    jade 0.27.7


입니다. 그 외 소소한 것은 Default 를 쓴다고 해도 별 무리는 없을 듯 합니다. (OSX 에서 node.js 와 
npm 설치 방법은 여기 참조 하시면 됩니다)

1. express 를 설치해 줍니다.
    
   

 $ sudo npm install -g express 

       
express 를 전역으로 설치해 주라는 명령입니다. 전역은 별 다른 차이가 없다고 보시고 다만 명령행이 존재한다면 그 명령을 command line 상에서 사용할 수 있다는 점이 다르다고 보면 됩니다. 

2. 프로젝트를 만들어 줍니다. blog 라는 이름이 좋아보이는 군요. 

       $ cd ~/work
       $ mkdir blog
       $ cd blog
       $ express -c stylus
       $ npm install -d 


프로젝트를 만들고 연관된 하위 라이브러리들을 전부 설치해 주라는 명령입니다. 

3. nodemon 을 설치해줍니다. 

       $ sudo npm install nodemon


express 로 코딩을 하다보면 뭐 변경될 때마다 Ctrl-c 누르고 '화살표 위'를 누르는 횟수가
 비약적으로 많아집니다. nodemon 은 js 파일이 변경될 때마다 자동으로 파일을 재구동해주는 편리한 툴입니다. 손가락에 병 생기기 전에 미리 미리 깔아줍시다. 

4. 기본 템플릿으로 만들어진 것을 구동시켜 봅니다. 

       $ cd ~/work/blog
       $ nodemon app.js


구동시키면 다음과 같은 에러가 발생합니다. 

`doctype 5` is deprecated, you must now use `doctype html`
(예전하고 변경됐군요.)
       
 ~/work/blog/views/layout.jade 파일을 열어서 에러메시지처럼 변경해줍니다. 

 doctype 5 -> doctype html 


 로 변경해줍니다. 

http://localhost:3000 을 브라우져에 입력하면 아무것도 안했지만 자동으로 만들어진 내용들이 화면에 출력됩니다. 

5. 데이타베이스를 만들어 봅니다. 나중에는 Mongodb 와 연결할 것입니다. 하지만 처음에는 메모리에
 간단한 타입으로 만들어서 테스트 해 볼것입니다. 

       $ cd ~/work/blog
       $ emacs articleprovider-memory.js 



자 수많은 callback 들하고 higher-order function 들이 난무하기 때문에 정신 사납지만 조금만 익숙해지면 쉽게 볼 수가 있을 것입니다. 사실 고백하자면 Synchronous 방식에 익숙해져 있다면 Node.js 의 거의 대부분을 이루고 있는 Asynchronous 방식이 많이 혼동될 수가 있습니다. 언젠가 언급을 하겠지만 미리 소스를 읽기 쉽게 가볍게 설명을 드리면 

- Callback 함수는 소스 볼 때 잊어버리는 것이 편하다. 
  Callback 은 Asynchronous 일 때 함수의 원하는 행동이 끝나고 나서 추가로 동작하는 방식으로 구동됩니다. function A (id , callback ) ; 이라는 함수가 있다면 A 의 내용이 수행되고 그 다음에 차례로 callback 이라는 함수가 실행된다고 보는 것이 편합니다. 

- function A (id, function (err, result) {..}) ; 와 같은 형식으로 선언이 되어 있다면 
  A 를 실행하기 위해서 파라미터로 id 가 필요하고 그 결과가 err 와 result 로 나온다 라고 보시면 편하게 이해되실 수 있습니다. 

드릴 말씀이 많지만 이 부분을 기억하시고 소스를 보시는 것이 마음 편하게 이해되실 듯 합니다. 


6. 5 에서 만들어준 방식과 app.js 와 연동 시켜보는 작업을 해 줍니다. 

       app.js 를 열어서 

       var express = require('express')
          , routes = require('./routes')
 , user = require('./routes/user')
 , http = require('http')
 , path = require('path');


의 아래에 
       

       var ArticleProvider = require('./articleprovider-memory').ArticleProvider;


과 같이 추가해 줍니다. 

       // app.get('/', routes.index);


기존의 소스를 커멘트 처리 해주시고 
       
그 위에다가 
 


을 추가해 줍니다. 

부연 설명을 드리자면 GET 방식으로 들어온 요청 '/' 에 대해서 function (req, res) 을 수행하라는 내용입니다. 그리고 다시 그 안으로 들어가 보면 articleProvider.findAll 을 수행하고 난 뒤에 function (error, docs) 를 수행하라는 뜻입니다. articleProvider.findAll 의 결과는 error, docs 가 되겠지요? 이 부분을 확실하게 이해를 하는 것이 좋을 것입니다. 거의 대부분이 이런 형식으로 이루어져 있습니다. Asynchronous 방식과 higher-orders function (함수를 입력 파라미터로 넘겨 받는 방식) 그리고 Anonymous function 이 섞여있는 Node.js 의 전형적인 방식의 함수 모습입니다. 

app.get 은 URL 로 넘겨온 값을 '매칭' 하는 함수이고 그것을 실행한 결과를 function (req, res) 로
 넘기고, articleProvider.findAll 은 articleprovider-memory.js 에서 선언한 함수입니다. 저장된 데이터를 전부 가져오고 난 뒤에 파라미터로 선언된 Anonymous function 인 function (error, docs) 를 실행하고 그 결과값 - 저장된 데이터 - 가 docs 로 넘겨집니다. 

http://localhost:3000 에 다시 잘 동작하는 지 확인해 봅니다. 

7. 이제 포장 작업을 해줄 차례입니다. 

       $ emacs ~/work/blog/views/index.jade


로 기본 화면 구성을 열어줍니다. 


jade
 라고 불리는 HTML 엔진입니다. 위 처럼 써주면 대응되는 HTML 코드로 바꾸어 줍니다. 자세한 것은 따로 공부를 하시면 됩니다. (저도 뭐 HTML 은 고수가 아니라서..)

extends layout 이라는 것은 layout.jade 로 부터 확장한다는 뜻입니다. 기초적인 설정은 전부 그곳에
 있다고 해도 과언이 아니겠지요? 

       $ emacs ~/work/blog/views/layout.jade 


로 열어줍니다. 



body 부분에 쓰여져 있는 block content 가 index.jade 의 block content 와 대응되리라는 것을 쉽게
 알 수가 있습니다. (응?..)

8.
jade 파일이 준비가 됐다면 app.js 에서 바꾸어 줄 필요가 있습니다. 


여기서 res.send 는 기본적인 내용을 전달하는 것이므로 (그래서 json 기반의 app 서버 작성시 편합니다) 렌더링 해주는 함수로 변경해줘야 합니다. 위 내용을 


index.jade 를 기본으로 삼되, title 에는 'Blog' 값을 넘기고 , articles 에는 docs 를 넘기라는
 내용입니다. 

9. 이쁘장 (?) 하게 바꾸어줄 시간입니다. (It's CSS Time!!)

귀찮으니까 나중에 쓸 내용까지 전부 CSS 로 밀어 넣기로 합니다. 참 이 내용은 stylus 라는
 라이브러리를 이용합니다. 

       $ emacs ~/work/blog/public/stylesheets/style.styl





인덴테이션이 중요합니다. 이 파일을 작성하면 이 파일에서 style.css 를 자동으로 생성하는 것 같습니다. (자세히는 모르겠음..)
        
여기까지 작성이 완료 됐다면 http://localhost:3000 으로 확인 바랍니다. 색.. 색깔이 나올것입니다. 

10. 새로 글 작성하는 기능을 추가해 보겠습니다. MVC 모델에 따라서 , M 은 이미 작성되어 있고
 (articleprovider-memory.js) 로 , V 에 해당하는 부분을 작성해 줍니다. 

$ emacs ~/work/blog/views/blog_new.jade



음.. 암호 같지요? 저한테도 암호 같습니다. 당분간 외워서 하는 수밖에 없을 듯합니다. 

11. 10 에 대응되는 C (controller) 부분을 추가해 줍니다. 2개의 라우팅 부분을 추가해 줍니다. 

$ emacs ~/work/blog/app.js



app.get 은 GET 방식 , app.post 는 POST 방식입니다. app.get 방식으로 '/blog/new' 로 브
라우져에서 접속하면 blog_new.jade 를 렌더링 하고 , 그 렌더링 페이지에서 내용을 입력하고 Send 버튼을 클릭하면 articleProvider.save 함수를 호출하고 res.redirect 함수로 '/' 에 돌아간다는 내용입니다. http://localhost:3000/blog/new 로 이동해서 테스트 해보기 바랍니다. 

12. 이제 mongodb 를 붙일 시간입니다. 지금까지 만들어온 메모리 버젼은 소스 변경하면 (nodemon 이
 알아서 app.js 를 재구동하니..) 작성하고 테스트 한 내용이 날라가버립니다. 그런 귀찮음을 제거하고자 mongodb 를 연동하는 것입니다. 

먼저 mongodb 모듈을 설치해야 합니다. . 

$ emacs ~/work/blog/package.json




에 위와 같이 "mongodb": "*" 를 추가해 주고 

$ cd ~/work/blog
$ npm install -d 


를 실행 합니다. 
 

13. 이제
mongodb 와 연결해서 포스트 관리해 주는 articleprovider-mongodb 를 제작할 시간입니다.

$ cd ~/work/blog
$ emacs articleprovider-mongodb.js 




14. memory 에서 articleprovider-mongodb 로 바꼈기 때문에 연관된 부분을 app.js 에서 수정할 필요가 있습니다. 

$ cd ~/work/blog
$ emacs app.js


아래와 같이 변경 해줍니다. 

var ArticleProvider = require('./articleprovider-mongodb').ArticleProvider;
//var ArticleProvider = require('./articleprovider-memory').ArticleProvider;


 
메모리를 로딩하는 부분을 comment 처리해주고 그 위로 내용을 추가해 줍니다. articleprovider 를 mongodb 기반으로 바꾸어 준다는 내용입니다. 

var articleProvider = new ArticleProvider('192.168.0.87', 27017);
// var articleProvider = new ArticleProvider();


이 내용은 192.168.0.87 서버에 mongodb 가 띄어져 있고 27017 port 로 접속한다는 이야기
 입니다. 제 경우는 머신이 두대 있을 경우에 쓰는 방법이고 대부분 한 서버에서 같이 동작시킬 때는 192.168.0.87 대신 localhost 라고 입력해 주시면 됩니다. 

또 저와같이 다른 머신에 mongodb 데몬을 띄워논 경우에는 그 머신의 mongodb.conf 파일을 열어서 bind_ip 부분을 comment 처리 하거나 

bind_ip = 192.168.0.* 


으로 같은 대역대에 있는 접속을 허용하는 식으로 변경해 주어야 외부에서 접속이 됩니다. 물론 내부는 세팅해 줄 필요가 없습니다. mongodb.conf 파일은 ubuntu 경우에는 /etc/mongodb.conf 존재합니다. 

15. index 페이지에서 개별 개별 포스트를 클릭했을 때 , 내용을 상세하게 보여주는 페이지 부분에 대한 작성 입니다. 

먼저 V (views) 부분에 대한 처리입니다. 

$ emacs ~/work/blog/views/blog_show.jade



jade 는 꼭 시간을 들여서 익히셔야 합니다. (저도..) 웹 개발이 빨라집니다. 

16. index 페이지에서 개별 개별 포스트를 클릭했을 때 , C (controller) 에 해당하는 라우팅 하는
 부분을 app.js 에 추가해줍니다. 

$ emacs ~/work/blog/app.js




http://localhost:3000 으로 화면을 띄우고 개별 Post 를 클릭하셔서 제대로 동작되는 지 확인하시면 됩니다. 

17. 이제 개별 Post 에 댓글 기능을 추가해 보겠습니다. 16 에서 열어둔 파일에 마저 작업을 해
 줍니다. POST 방식으로 댓글을 Post 에 추가하는 로직입니다. 

$ emacs ~/work/blog/app.js



을 추가해 줍니다. View 에 해당하는 것은 언제 추가해 주냐고요? 15 에서 추가해 줬습니다. 자 이제 모든 것이 완성 됐습니다. http://localhost:3000 에서 확인해 주시기 바랍니다. 

원문 은 여기서 확인 가능합니다. 구버젼 node.js 와 express 로 되어 있어서 현행화 이슈가 있었기에 제가 정리하는 김에 현행화를 한 것입니다. 

제가 현행화한 모든 소스는 https://github.com/crazia/nodejs-mongodb 여기에서 다운 받을 수
 있습니다. 

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


하시면 쉽게 완성된 형태를 따라하실 수 있습니다. 

Node.js 와 Node.js 를 잘 활용하기 위한 웹 프레임워크까지 쭈욱 따라하기 식으로 하루만에 쫓아갈 수 있는 훌륭한 튜토리얼이 정리되어 있습니다. 비록 영어이긴 하지만 신기술은 번역되어 있는 것을 구하기 힘드니 여기서 쭈욱 따라가시면서 이해만 하시면 충분히 node.js 로 바로 웹 사이트 하나 만들 수 있는 실력을 구비하실 수 있을 것입니다. 

Node.js 설치하기 는 예전 제 포스트를 참조하시면 됩니다. 

기본 (The Basics) (1-2 시간 소요)


기본적인 문법과 Asynchronous 코딩에 대한 기본을 설명해주고 있는 훌륭한 책입니다. 정말 쭈욱 따라하시면 됩니다. 

더 깊게 들어가기 (Going Deeper) (1 시간 소요)

chapter7 Asynchronous 한 Control Block 에 관한 개요와 설명입니다. 꼭 읽어볼만한 부분입니다. 
추가로 chapter9 , chapter10 , chapter11 도 보시면 좋습니다. 

익스프레스 웹 프레임워크 (The Express Web Framework) (45 분 정도 소요)

아쉽게도 현재 동영상 서비스를 중단한 상태더군요. nodetuts.com 에서 서비스 되고 9, 10, 11  편입니다. 빨리 서비스 재개가 됐으면 좋겠습니다.

정말 간단하고 빨리 웹 개발을 할 수 있는 Express 프레임워크에 대한 설명입니다. 간단한 app server 만들기에 거의 최적화 되어 있다고 보면 됩니다. 비디오로 되어 있고 3편입니다. 

실제 예제 (A Real Example) (1 시간 소요)

express-mongodb 익스프레스와 몽고디비를 연결해서 구현하는 방법에 관한 실전 예제입니다. 

참조 사이트 : http://project70.com/nodejs/beginners-tutorial-node-js/ 


CLisp 이나 C++ 에서는 쉽게 설정하는 함수 인자 기본 값 (Default) 설정하는 방법에 관한 예제입니다. 일단 쉽게 설정하는 방법이 없는 듯 합니다. 

1 user=> (defn bar
2          ([a b]   (bar a b 100))
3          ([a b c] (* a b c)))
4 #'user/bar
5 user=> (bar 5 6)
6 3000
7 user=> (bar 5 6 2)
8 60

이 와 같은 식으로 가장 인자 수가 많은 함수를 내부에서 호출하는 형식으로 꾸며줍니다. 그 외에 다른 방식으로는 :keyword 형식으로 호출하는 등등이 있으나 위에 쓰여지는 방법이 그나마 다른 언어(Language)에 익숙한 방법이라 사료됩니다. 

defn 설명 페이지 


Parallelism Versus Concurrency

Lest our discussion of concurrency and parallelism lead you to think they are the same thing, let’s disentangle the two notions.

Concurrency is the coordination of multiple, usually interleaved threads of execution that are accessing or modifying some shared state.

Parallelism involves state as well, but usually in the inverse. Being an optimization technique used to efficiently utilize all of the available resources (usually computational, but sometimes other resources, like bandwidth) to improve the performance of an operation, approaches to parallelization generally aim to maximize the window of exclusive access to state (or, often, chunks of state) so as to minimize coordination overhead. Rather than involving interleaved threads of execution, the multiple evaluations of a parallelized operation run simultaneously—sometimes on different CPU cores, other times on different physical machines entirely.

-- Clojure Programming 책 중에서 .. 


쉽게 설명하자면 

'동시성' 은 공유되는 자원에 대한 접근이나 변경을 주도하는 쓰레드들을 배치하는 작업에 관한 용어이고 

'병렬성' 은 공유될 수 있는 자원에 대한 최적화된 사용에 관한 용어입니다. 보통 쓰레드 배치나 이런 것은 당연히 적용하지만 잡-스케쥴링 (Job - scheduling) 을 통해서 다중 CPU 일 경우 각각의 CPU 나 코어 에서 작업을 분배시켜서 돌리게 하거나 또는 아예 다른 기계에서 작업을 돌리게 한다던지 와 같은 오히려 작업 분배에 관한 용어로 쓰일 때가 많습니다. 



 

+ Recent posts