node.js – 1) 설치 및 Hello World

안드로이드 앱 ‘쌤통‘의 관리자 페이지 작성을 해야할 필요성이 생겼다.
쌤통의 서버 코드는 자바로 작성되었는데, 관리자 페이지 코드는 서버 코드와는 별개의 다른 언어로 작성하고 싶었다. DB 데이터만 가져오면 되기 때문에 서버 코드에는 영향을 주지 않으면서도 쉽고 간편하게 작성할 방법이 없나 찾던 중 Node.js가 생각 났다.

nodejs
Ryan dahl이 개발한 서버 프레임워크인 Node.js를 사실 1년 전에 살짝 건드려보긴 한 적이 있었다. 그때는 정말 간단하게 Hello World! 예제만 돌려보고 ‘와~ 신기하다’ 하고 끝냈었다.

이번에 작성해야 하는 관리자 페이지는 디자인 보다는 현재 ‘쌤통’ 앱의 가입자 수, 가입자 추세 같은 데이터 현황만 확인하면 되기 때문에 Node.js 라는 거의 처음 써보는 프레임워크로도 작성할 수 있겠다 하는 생각이 들었다.

  1. 먼저 리눅스에 Node.js를 설치한다.(설치 환경: CentOS release 5.8 (Final))
    Node.js 공식 페이지에 접속하여 설치 파일을 다운로드 한다.
    http://nodejs.org/download/ 에 접속하면 다음과 같은 화면이 나오는데 여기서 본인의 서버 환경에 맞는 링크를 선택하면 된다.
    Node.js 다운로드
    설치 환경이 리눅스 이기 때문에 리눅스 설치 파일을 다운로드 한 뒤 압축을 풀어준다.

    [root@getbanana test]# tar xvzf node-v0.10.22-linux-x64.tar.gz
    

    압축을 푼 디렉토리로 이동하면 다음과 같은 파일과 디렉토리 구조를 볼 수 있을 것이다.
    Node.js 디렉토리 구조
    여기서 bin 디렉토리로 이동하면 node와 npm 파일을 볼 수 있다. node 파일이 node.js를 실행하는 파일이다. 다음과 같이 명령어를 입력하여 node.js의 버전을 확인해보자.

    [root@getbanana test]# ./node -v
    [root@getbanana test]# v0.10.22
    

    이 글을 작성하는 시점의 node.js 버전은 0.10.22이다. 아직까지 1점대 버전이 아니라는 점이 눈에 띈다.
    node.js 설치를 위해 아직 한 단계 남았는데 node와 npm 파일의 심볼릭 링크를 걸어주는 것이다. 리눅스 환경에서 프로그램을 실행하려면 절대경로로 실행해야 하는데, node가 설치된 디렉토리와 작업공간이 상이할 경우, 이는 매우 불편하다. 그런데 node 파일을 특정 디렉토리에 심볼릭 링크로 걸어놓으면 절대경로 없이 ‘node’라는 키워드로만 실행시킬 수 있다. 여기서 특정 디렉토리는 ‘/usr/local/bin’이다. CentoOS 기준이기 때문에 다른 리눅스 버전에서는 다를 수 있으니 관련해서는 검색해보길 바란다.
    파일을 심볼릭 링크를 걸기 위해서는 다음과 같이 하면 된다.

    [root@getbanana test]# ln -s * /usr/local/bin/.
    

    현재 디렉토리에서 다른 디렉토리로 이동 후 ‘node -v’ 명령어를 실행해보길 바란다. 그랬을 때 위의 bin/ 디렉토리에서의 실행결과와 동일하다면 심볼릭 링크가 제대로 걸린 것이다.
    이것으로 node.js의 설치가 마무리 되었다.

  2. HelloWorld 예제 작성하기
    어떤 언어, 어떤 프레임워크를 사용하던지 가장 처음에는 Hello World! 예제를 작성해야 제맛이다.
    시작이 반이라는 말도 있지 않은가?(Hello world 예제를 작성할 정도로 열의가 있다면 해당 분야의 나머지도 분명 정복할 수 있을 것이다.)(1년 전 Hello world 예제 작성 후 중단한 것은 너무 바빠서 그랬던 것이다.)

Hello World 예제 작성의 가장 바람직한 방법은 해당 언어, 프레임워크의 공식 페이지를 뒤져보는 것이다.
다시 node.js의 공식 페이지에 들어가보자, 친절하게도 메인 페이지 하단에 Hello World 예제가 있다.(링크)
Hello World 예제를 간략히 소개하자면, 웹 서버를 띄우고 사용자가 접속하면 Hello World 라는 문자열을 출력해주는 것이다.
공식 페이지의 예제를 가져온 것이 하단의 코드이다.

// 코드 1
var http = require('http');
var callbackFunction = function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

http.createServer(callbackFunction).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

2: http 라는 모듈을 불러온다.
node.js는 자바스크립트 모듈화 진영에서 de facto처럼 여겨지는 CommonJS를 사용한다. 위에서 require라는 함수를 사용한 것을 볼 수 있는데 여기서 바로 CommonJS를 사용하여 ‘http’ 모듈을 불러온다. 자바스크립트 모듈화와 관련해서는 이 글을 읽어보시길 바란다.

3: callbackFunction 함수를 선언한다. 이 함수는 웹 서버의 event listener의 역할을 수행한다.
코드의 4번째 줄에서는 Content-Type을 기술한다. 5번째 줄에서는 Hello World 라는 문자열을 내보냄과 동시에 출력을 종료한다.(end 함수) 출력을 계속 이어가고 싶으면 end 함수 이전에 res.write() 함수를 사용하면 된다.

8: 가장 중요한 부분. 2번째 줄에서 불러온 http 모듈의 createServer 함수를 호출한다. 함수를 호출하면서 2번째 줄에서 선언했던 callbackFunction 함수를 인자로 주는 것에 주목해야 한다. 함수 호출 후 돌려받는 객체에서 다시 listen 함수를 호출한다. listen 함수의 첫 번째 인자는 포트번호, 두 번째 인자는 호스트 이름이다. 웹 서버에 접속할 때의 주소 경로를 설정하는 것이다.
여기서 중요한 것은 node.js는 event 기반으로 작동한다는 것이다. event 기반으로 작동한다는 의미에 대해서는 아웃사이더 님이 okjsp에서 발표하신 http://www.slideshare.net/rockdoli/nodejs-at-okjsp 를 참고하길 바란다.
createServer 함수 호출 시 넘겨줬던 callbackFunction이 event listener이다. 즉, 사용자가 웹 서버에 접속하면 callbackFunction을 호출한다는 의미이다.
8번째 줄을 한 문장으로 요약하자면, “http://127.0.0.1:1337 로 사용자가 접속할 경우 callbackFunction 함수를 호출한다.” 이다.

example.js 라는 파일에 위 코드를 적고 다음과 같이 nodejs를 실행시켜 보자.

[root@getbanana test]# node example.js
[root@getbanana test]# Server running at http://127.0.0.1:1337/

그런 뒤, 브라우저를 열어서 http://localhost:1337로 접속해보자.
그러면 하얀 화면에 Hello World 라는 문자열만 떡하니 찍힌 것을 볼 수 있다.

사실 위에서 작성했던 example.js 코드(코드 1)는 nodejs.org에 있는 예제 코드를 내가 임의로 수정한 것이다. 설명하는데 편하도록 코드를 수정했는데 원래 코드는 다음과 같다.

// 코드 2
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

코드 1에서 callbackFunction이 사라지고 createServer 함수의 인자에 함수 자체를 기술한다. 이 방식이 event 기반의 node.js에서 가장 대표적으로 사용되는 함수 기술 방식이다. http 모듈의 createServer 함수를 호출할 때 함수 자체를 넘겨준다는 것은 서버에 인자로 넘겨주는 함수를 listener로 등록한다는 의미이다.

본 포스팅은 여기서 마무리한다. 관리자 페이지를 직접적으로 작성하는 부분은 2편에서 다루도록 하겠다.