Inspired World

Node.js - JavaScript로 Server-side 프로그래밍을?! 본문

Node.js

Node.js - JavaScript로 Server-side 프로그래밍을?!

InspiredJW 2012. 1. 29. 03:28


Node.js

JavaScript에 관심이 있거나 새로운 웹 트렌드에 관심이 있는 사람이라면 한번 쯤은 인터넷을 돌아다니다가 본 적이 있을 단어입니다.

JavaScript와 JavaScript 개발자들이 저평가 받는 시절이 있었습니다.

JavaScript라 하면 그저 Mouse, Keyboard 이벤트나 간단한 DOM 조작이나 가능한 웹브라우저에 탑재된 언어라는 인식이 있었지만 (물론 SpiderMonkey나 Rhino와 같이 웹브라우저가 아닌 곳에서 JavaScript를 사용해왔지만)

이 인식을 깨는 데 AJAX 의 탄생이 한 몫 했는데요.

AJAX (정확히는 XmlHttpRequest, 줄여서는 XHR)의 활용으로 인해 JavaScript 에서 Client-side 와 Server-side를 넘나들며 자연스럽게 처리할 수 있는 방법이 생기면서 JavaScript 가 재조명을 받기 시작합니다.

또한 AJAX로 인해 Web 2.0 이라는 말이 생겼다고 과언이 아닐 정도로 많은 영향을 끼쳤습니다.

예전에는 일반적인 HTTP 요청의 형태에서 벗어나지 못한

 클릭 -> 페이지 이동 -> 클릭 페이지 이동  및 팝업 창 및 hidden iframe

으로 굳이 페이지를 이동하지 않고서 서버와 클라이언트가 정보를 주고 받으며 일을 처리하게 했다면 이제는 그런 일들을 AJAX(xhr)을 통해 처리할 수 있게 되었습니다.

AJAX 활용의 대표적인 예로는 Google 의 Gmail, Google Maps와 이제는 흔하게 볼 수 있는 자동 검색어 추천 기능 등이 있습니다.

위 문구처럼 jQuery와 함께라면 적은 코드로도 많은 일을 크로스 브라우징이 되면서 할수 있습니다

그리고 사실 저 같은 경우에는 JavaScript 자체에 매력 보다도 jQuery를 접하게 되면서 chain programming 을 경험하며 즐거움을 느끼다가

본래 JavaScript에 깊은 관심을 갖게 된 케이스입니다; 또 Ajax를 jQuery로는 쉽게 함수를 호출해서 할 수 있다는 것도 매력이구요 ㅎㅎ

다소 Node.js 와 상관없는 서론이라고 생각될 수 있겠지만 

Node.js도 JavaScript라는 공통된 뿌리가 있는 만큼 연관성이 아주 없지는 않다고 생각해서 이야기를 해보았습니다.


이제부터는 Node.js 이야기!

Node.js는 2009년 11월 Ryan Dahl 이 세상에 발표해서 알려졌으며

V8 Engine, High Scalable, Non-blocking, Event-Loop 라는 특징을 가지고  태어났습니다.
V8 Engine - Google 에서 개발한 JavaScript 엔진 Google Chrome 브라우저에 탑재됨 (오픈소스)

V8 Engine 특성상 JavaScript 소스를 기계어로 바꿔주기 때문에 속도는 빠를 수 밖에 없고

High Scalability(서버 증설 및 확장을 통해 더 많은 처리를 할 수 있게함)라는 이슈를 해결하기 위해 기존의 방법이 Thread를 늘려 동시에 요청을 처리하게 했지만

동시 요청 수가 늘어남에 Thread 방식의 Apache vs Event 방식의 Nginx 의
메모리 사용률의 차이를 극명하게 보여주는 그래프


C10K 문제 라는게 발생하게 됩니다. 서버가 10000개 정도의 Thread를 감당할 수 있다는 것이죠.

그래서 Asynchronous 방법을 사용하게 되는데 대표적인 웹서버로는

Nginx, Lighttpd가 있구요

Thread 대신 Event-Loop 에서 Asychronous 하게 처리하기 위해서 필요한 웹 프레임워크가 필요하게 되는데 파이썬이나 루비에서도 이런 시도는 있어왔지만

JavaScript에서 만큼 자연스럽게 callback function을 만들고 non-blocking style을 지향 할 수 있는 언어가 또 있을까요?

그리하여 탄생하게 된 것이 Node.js 입니다!

Node.js 자체만으로 아래 처럼 웹서버를 돌릴 수 있지만
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/');
Ryan Dahl 의 추천사항으로 아직 발견되지 않은 Buffer Overflow 으로 인해 발생할 수 있는 취약점을 Nginx 를 앞에 Reverse Proxy로 둠으로써 완벽하진 않지만 어느정도 가릴 수(?) 있다고 합니다. 또 Static File( CSS, JavaScript, Image, Icon, Static HTML 등)을 더 잘 Serving 하기 때문이기도 하구요.

주의: Nginx에서는 Websocket을 지원하지 않습니다

Node.js 로 프로그래밍 하다보면 느끼는 건 Server-side 에서의 언어와 Client-side 의 언어가 같음으로써 미묘한 Syntax나 문법의 헷갈림이 없어서 좋습니다 ㅎㅎ

특히 Python의 Dictionary나 Java의 Map과 같이 자연스럽게 JSON을 주고 받지 못하고

PHP와 같이

json_encode() json_decode() 를 통해

JSON을 Array로 바꿔서 주고 받아야 할 때면 달갑지 않죠

하지만 Node.js 는 어차피 JavaScript이기 때문에 이런 문제가 없죠.

그저 JSON.parseJSON.stringify로 슥삭슥삭 바꿔주면 됩니다.

Node.js 세계에 입문 하실 때 Windows 환경에서도 물론 할 수 있지만 Linux 나 Mac 을 추천합니다. Windows에서는 일부 모듈이나 환경이 달라서 충돌이 나는 경우가 있더라구요
예: mongodb-native 드라이버는 Windows환경에서 호환이 되지 않음

그리고 Node.js 0.6.x 버전 부터만 Windows 환경에서도 지원합니다.

Node.js 하시다보면 여러 오픈소스 모듈들을 접하게 되는데 npmjs (Package Manager) 로 쉽게 모듈들을 설치 할 수 있고 또 이를 통해 설치된 모듈들을 이용하고 살펴보려면 GitHub와도 친해지셔야 합니다


Node.js가 비록 생긴지 얼마 안됬지만 워낙 열정적인 개발자들이 대거 참여하고 있는 프로젝트이기 때문에 Node.js 자체도 2주에 한번 꼴로는 업데이트.. 가 되고 있고

각종 주옥같은 모듈들도 업데이트를 지속적으로 사람들과 토론하며 GitHub에서 만들어가고 있습니다. 

주옥같은 모듈로는 Connect, Express, Socket.IO 등이 있는데요

너무나 많은 모듈들이 지금도 활발히 개발되고 있기 때문에 다 나열할수는 없구요 ^^;

이 곳에 보면 DB 드라이버(MySQL부터 시작해서 NoSQL 계열인 MongoDB, Redis, CouchDB, DynamoDB 등), 각종 템플릿 엔진이나 Oauth 방식을 이용하는 SNS 아이디를 통한 로그인 기능 연동이나 여러가지 모듈들이 많이 있습니다.

요즘 Connect, Express Middleware오픈소스로 하나 개발하고 싶은데 혹시 좋은 아이디어같이 개발하실 분 있으면 댓글 달아주시기 바랍니다 ^^ 
Comments