Node.js의 도입 전 리서치 결과



Node.js는 자바스크립트 엔진으로 구동되는 이벤트 기반 I/O 프레임워크입니다. 주로 웹 서버를 구축하는데 많이 이용되는데요. 이 때문에 클라이언트에서만 사용되던 자바스크립트가 서버 제작에 사용되어 업계를 깜짝 놀라게 만들었죠. 기능적인 부분은 쉽게 말해, boost의 asio와 비슷하다고 볼 수 있겠습니다.

이 기술을 사용해볼까 고민하면서 이것저것 돌아다니는 자료를 모아봤습니다. 그리고 혹시 같은 고민을 하고 계신 분들이 있을까 싶어 공유합니다.

----

구글은 V8이라는 자바스크립트 엔진을 오픈 소스로 개발하여 크롬 브라우저에 탑재하였습니다. 라이언 달이라는 개발자는 이 엔진을 떼어다가 서버로 옮겨놓고 서버 프로그램으로 제작하기 위한 프레임워크를 개발했죠. 덕분에 자바스크립트 언어롤 서버에서 돌리는 재미있는 기술이 탄생했습니다.

라이언 달은 Node.js를 만들며 잡은 목표는 사실 간단했습니다. 'Gmail처럼 푸쉬(Push) 기능이 되는 웹 사이트를 만드는 기반 시스템'을 만들어보자.

결국 개발 한 결과물은 이런 특징들을 갖게 되었습니다:

  • 단 하나의 쓰레드가 이벤트 룹을 구동
  • V8 엔진 내부적으로 코드를 컴파일하여 구동
  • 이벤트 구동형 프로그래밍(Event-driven Programming)으로 비동기 I/O를 구현
  • 익명의 함수(Anonymous function)와 클로져(Closure)를 사용
  • HTML5 표준 중 하나인 WebSockets를 라이브러리 형태로 지원


이런 특징이 Node.js에게 이런 장점을 안겼습니다:

  • 기존 스크립트 언어는 인터프리터 언어로서 파싱하며 구동하기 때문에 속도가 느리지만, Node는 내부적으로 컴파일 된 바이너리 형태로 구동하므로 속도가 빠르다.
  • 웹 클라이언트에서 자바스크립트를 이용한다면 서버와 클라이언트가 언어가 통일되고, 주요 로직이 쉽게 공유 될 수 있다.
  • 기존 웹 서버들이 컨넥션당 쓰레드(혹은 프로세스)를 할당하는 것과 달리, 단일 쓰레드를 이용하므로 데드락에서 자유롭다.
  • 쓰레드(혹은 프로세스)의 소비가 없기 때문에 메모리 과다 할당 문제가 없다. 따라서, 같은 메모리 크기로 더 많은 동시 접속을 받을 수 있다.
  • WebSockets을 라이브러리 형태로 지원하므로 TCP/UDP 연결도 가능하다. (내부적으로는 Flash Socket, JSONP Polling, AJAX Long Polling 등으로 Fallback 지원)
  • 컴파일이 필요없기 때문에 코드의 수정과 테스트가 편리하다.


하지만 그에 비해 이런 문제점들도 있을 수 있습니다:

  • 쉽게 구현되는 JSON 프로토콜을 이용하면 바이너리 데이터에 비해서 크기느 엔코딩/디코딩에서 느릴 수 있다.
  • 이벤트 구동 방식 프로그래밍은 기존의 제작 방식에 비해 학습이 어려울 수 있다.
  • 실수로 동기적 코드를 이용하는 경우 치명적인 성능 저하를 유발 할 수 있다.


위를 검증하는 몇몇 테스트 결과도 추가합니다:



혹시 틀렸거나 보강해야 하는 부분이 있다면 친절히 알려주시면 감사하겠습니다.

0 comments:

댓글 쓰기

Powered by Blogger.

Popular Posts