Node.js?
널리 알려진 대로 Node.js는 Server side 자바스크립트이며, 구글의 자바스크립트 엔진인 V8(블로그에 포스팅한적있다. 참고 http://codekit.tistory.com/193)을 기반으로 구성된 일종의 소프트웨어 시스템이다.
이벤트 기반으로 개발할 수 있으며 Non-blocking I/O를 지원하기 때문에 비동기식 프로그래밍을 할 수 있다. 이 때문에 I/O 부하가 심한 대규모 서비스를 개발하기에 적합하다고 할 수 있다. 자바스크립트의 표준라이브러리 프로젝트인 CommonJS의 스펙을 따르고있다. 사실 노드에서 처음 등장한 것과 같이 느껴지는 비동기프로그래밍 모델은 최근 등장한 새로운 개념은 아니다.
노드? Node.js?
공식적인 명칭은 “Node.js”로 되어 있지만, 개발자 대부분이 “Node”, 한글로는 “노드’라고 언급하는 경우가 많고 실제 공식 사이트에서도 “Node”라고 표기하고있다.
**
**
노드의 탄생 배경
노드가 개발된 배경과 목적은 다수의 연결을 효율적으로 관리하고 비용을 최소화 할 수 있는 네트워크 소프트웨어를
개발하는 편리한 방법을 제공하기 위함이었다. 자바스크립트를 서버에서 사용하고자 하는 노력이 반영된 결과이다.
노드는 서버에서 클라이언트로부터의 요청, 즉 연결을 처리하는 방법을 새로운 개념으로 변경하였다.
기존에는 각 연결에 대해 새로운 스레드(Thread)를 생성하고 그에 따라 메모리를 할당하여 사용자 요청을 처리했다면 노드에서는 각 연결이 하나의 이벤트로서 노드엔진에서 처리된다.
노드서의 설계 목표
- 함수는 플랫폼의 I/O에 직접적으로 접속하지 않는다.
- 디스크,네트워크,프로세스를 통해 데이터를 받으려면 반드시 콜백을 사용한다.
- 쉬운 네트워크 프로그래밍을 위해 TCP/DNS/HTTP같은 프로토콜을 지원한다.
- 다양한 HTTP Feature을 지원한다.
- 클라이언트 사이드 자바스크립트 프로그매러를 위한 코딩 스타일과 올드스쿨 프로그래머를 위한 유닉스 스타일을 고수함으로써 모두에게 친숙하게 디자인 되었다.
노드를 사용하는 사용 서비스들
- Yammer
- Linkedln
- WalMart
- Cloud9 IDE
노드를 지원하는 PaaS
- Joyent no.de
- Microsoft Azure
- VMWare Cloud Foundry
- Heroku
- DuoStack / dotCloud
- nodeSocket
- nodejitsu
- nodester
왜 노드를 사용하는가?
노드의 가장 큰 특징 중 하나인 “이벤트 기반의 비동기 처리방식”에 대해 알아보았다.
그러나 이것만으로는 노드에 매력을 덜 느끼는 사람도 있을 것이다. 하지만 노드는 이벤트 기반의 비동기 처리 방식이라는 특징 외에도
다양한 매력을 가진 녀석이다. 자바스크립트 기반으로 하고 있다는 점과 이벤트 기반의 프로그래밍 모델, 확장성 있는 모듈 구조는 확실히 노드를 더욱더 매력적으로
만들어주는 요소들이다. 또한 npm을 통한 다양한 확장 모듈들로 노드의 보급에 큰 영향을 끼쳤으며, 앞으로도 훌륭한 확장 모듈들이 쏟아져 나올 것으로 보인다.
노드의 아키텍쳐
노드는 C/C++과 자바스크립트로 만들어졌다. 대부분은 자바스크립트로 만들어졌으며 C/C++은 레이어와 시스템 통합을 위해 사용되었다. 지금까지도 몇 번씩이나 언급되었다시피 구글에서 만든 V8 자바스크립트 엔진 위에서 동작한다. 원래는 V8은 구글에서 크롬 브라우저를 위해 만든 자바스크립트 엔진이기에 서버를 위해 설계된 것은 아니다. 게다가 V8은 크롬의 멀티 프로세스 모델에서 실행되는 것을 목표로 설계되었다. 따라서 노드에서 V8엔진은 서버에서 동작할 수 있도록 일종의 용도 변경이 이루어졌다.
노드 표준 라이브러리
실질적으로 V8과 연결되어 특정 기능들을 수행할 수 있도록 도와주는 자바스크립트 기본 라이브러리이다.
이를 통해 노드 바인딩과 연결된다.
노드 바인딩
C/C++로 구성된 시스템 바인딩 레이어이다. 소켓,HTTP등의 통신 기능이 제공되지만 DOM에 관한 기능든 제공되고 있지 않다.
V8 엔진
V8 자바스크립트 엔진(V8 JavaScript Engine)은 구글에서 개발된 오픈 소스 JLT 가상 머신 형식의 자바스크립트 엔진이다.
구글 크롬 브라우저에 내장되어있다. 라스 백(Lars Bak)이라는 프로그래머가 개발하였는데 이 프로그래머는 선에서JVM(Java Virtual Machine)을
개발한 인물이기도 하다.(역시 클라스 . .) ECMAScript(ECMA-262) 3rd Edition 규격을 동작시킬수 있으며, C++로 작성되었다. 구글 크롬 브라우저에
내장되어 있지만, 사실은 독립적으로 실행 가능하며 또한 C++로 작성된 응용 프로그램의 일부로 작동할 수 있다. 노드는 이 엔진을 이용하여 자바스크립트로 개발된
노드 애플리케이션을 동작시킨다.
스레드 풀
스레드는 풀은 libeio라는 비동기 I/O 라이브러리로 구성되어 있다. 즉, 파일 관련 작업을 수행한다고 보면 된다. 이벤트 기반이 모든 게 비동기로 동작하는 C언어용 I/O라이브러리이다.
기본적으로 POSIX API에 기반을 두고 있으며 파일 처리 관련 작업을 수행한다. 파일 관련 처리 작업이란 read,write,open, close, stat, unlink, fdatasync, mknod, readdir 등의 작업들을 일컬으며, 모두 비동기로 처리한다. 다시 말해 이것은 POSIX의 비동기 버전이라고 생각하면 된다. 노드에서의 비동기 입출력 작업들은 모두 이 라이브러리로 동작한다고 생각하면 된다.
이벤트 루프
이벤트 루프는 libev를 이용하여 구성되어 있다. 다양한 기능을 가진 고성능 이벤트 루프 라이브러리이다.
libevent라는 라이브러리와 유사하며, 이것에 근거하는 마크 레만(Marc Lehmann)이라는 개발자가 개발하였다. 앞서 설명한 노드의 이벤트 루프가 이것으로 구성되어있다.
정리
- 노드는 서버사이드 자바스크립트 이다.
- 구글의 고성능 자바스크립트 엔진인 V8을 기반으로 구성된다.
- Non-Blocking I/O를 지원하며 이벤트 기반의 개발이 가능하다.
- CommonJS의 스펙을 따르고 있다.
- 노드는 라이언 달이라는 인물이 개발하였다.
- 노드는 오픈 소스 프로젝트이다.
- 노드는 많은 상용 서비스에서 실제로 사용되고 있다.
- 이벤트 루프는 작업을 요청하면서 그 작업이 완료되었을 때 어떤 작업을 다음으로 진행할지에 대해 콜백 함수를 지정해두고 작업이 완료되었을 때 해당 콜백 함수를 실행하는 방식을 말한다.
- 노드를 이용하면 클라이언트와 서버 사이드 모두에서 자바스크립트를 이용할 수 있다.
- 노드는 npm을 이용하여 다양한 확장 모듈들을 사용할 수 있다.