1. Node.js란?
Node.js 는 2009년 라이언 달 이 개발한 서버 개발 환경입니다. 구글 크롬 브라우저에서 사용하는 V8 자바스크립트 엔진을 기반으로 자바 스크립트로 애플리케이션을 개발할 수 있게 합니다.
1. Node.js 배경
자바스크립트는 1994년 넷스케이프사의 브랜든 아이히가 만든 프로그래밍 언어이다. 자바스크립트는 사용자가 웹 페이지를 이용해 더 많은 경험을 할 수 있게 했다. 인터넷 속도가 빨라져 더 많은 콘텐츠를 제공할 수 있게 되자 자바스크립트는 더 많은 곳에 활용되었다.
자바스크립트를 사용하는 인구가 많아지자 웹 브라우저를 벗어나 자바스크립트를 사용하려는 시도가 시작됐다. 데스크톱에서 자바스크립트를 사용하여 애플리케이션을 개발하고자 Adobe AIR 애플리케이션이나 윈도 8 애플리케이션을 사용하고 있다. 또한 스마트폰에서 자바스크립트를 활용하고자 하이브리드 애플리케이션을 사용하고 있다.
초기에 서버 환경에서 자바스크립트를 사용하고자 LiveWire나 Jaxer 등을 사용했다. 그러나 이때 발표된 서버 개발 환경은 자바스크립트의 가장 큰 단점으로 알려진 '속도' 가 문제였다. 즉, 자바스크립트가 서버 개발 환경에서 활용되려면 속도가 훨씬 빨라져야 했다.
자바스크립트의 속도 혁명은 2008년에 시작됐다. 2008년 9월 구글은 크롬 웹브라우저의 베타 버전을 발표했다. 크롬 웹 브라우저에 탑재된 V8 자바스크립튼 엔진은 C++로 개발되었으며 자바스크립트 코드를 기반으로 머신 코드를 생성하여 실행하므로 어떠한 자바스크립트 엔진보다 속도가 빨랐다. 또한 V8 자바스크립트 엔진의 가장 매력은 크롬 웹 브라우저의 코드를 오픈 소스 화하면서 V8 자바스크립트 엔진의 코드가 공개되었다는 것이다.
자바스크립트의 속도가 빨라지자 2009년 1월부터 자바스크립트를 웹 브라우저가 아닌 곳에서 쓸 수 있게 표준을 만들자는 의견이 많아졌고, 현재 CommonJS 프로젝트로 알려진 ServerJS 프로젝트가 시작됐다. CommonJS 표준 발표 이후 곧바로 라이언 달은 CommonJS 표준과 V8 자바스크립트 엔진을 기반으로 Node.js를 개발했다.
Node.js는 브라우저가 아닌 서버 환경에서 자바스크립트를 사용하고자 노력했던 결과물로, 대규모 네트워크 애플리케이션을 개발하고자 만들었다. 그렇다면 기존 네트워크 애플리케이션과 Node.js 를 사용하여 개발하는 네트워크 애플리케이션은 어떤 차이가 있는가? 기존 웹 서버는 대부분 스레드를 기반으로 하는 동기 방식으로 네트워크 입출력을 처리한다. 반면에 Node.js는 이벤트를 기반으로 하는 비동기 방식으로 네트워크 입출력을 처리한다. 스레드 기반 동기 방식과 이벤트 기반 비동기 방식 사이의 차이와 이것을 사용할 때 차이가 있다.
2. 이벤트 기반 비동기 방식
Node.js는 이벤트 기반 비동기 방식으로 작동하므로 대규모 네트워크 프로그램 개발에 적합하다. 이벤트 기반이 무슨 뜻인지 예시를 설명한다.
내가 사는 동네에 재래식 시장이 있다. 몇 년 전 명절에는 항상 집에서 모든 것을 만들었지만 최근에는 시장에서 물건을 구매한다. 시장에서 사야 할 물건은 과일, 나물, 한과, 각종 전 이다. 위치는 그림에서 나와있는 것과 같다. 어느 가게를 가도 결국 기다려야 한다. 이럴 때 효과적인 방법은 몸을 복제해서 여러 가게를 동시에 가는 방법이 있고 시장에서 대기표를 나누어 주는 시스템으로 바꿔서 대기표 받고 기다리는 방법이 있다.
몸을 복제해서 동시에 일을 처리하는 방식이 기존 네트워크 프로그램이 사용하는 방식이다. 동기 방식으로 일을 처리하는 대신 스레드를 여러 개 만들어 동시에 일을 처리한다. 굉장히 좋은 해결 방법이다. 그러나 일이 많아질 수록 스레드를 더 많이 나누어야 되니까 메모리 사용량이 폭발적으로 증가하는 단점이 있다.
대기표를 받고 기다리는 방법은 때가 되면 물건을 받는 방식이다. 처음에는 각 가게를 돌면서 대기표를 받고 순서를 기다린다. 대기 번호를 부르는 이벤트가 발생하는 순간 물건을 받아오면 된다. 이 방식이 바로 Node.js가 사용하는 방법이다. 이것을 '이벤트 기반 비동기 방식'이라고 부른다. 스레드를 하나만 생성하니까 몸은 하나이다. 그러나 이벤트를 사용하니까 빠른 속도로 일을 처리할 수 있다.
일이 아무리 많아도 몸은 하나고 메모리 사용량과 같은 시스템 리소스 사용량에는 변화가 거의 없다. 따라서 대규모 네트워크 프로그램을 개발하기 적합한 형태이다. 물론 장점만 있는 것은 아니다. 일을 처리하는 한 명이 쓰러지는 순간 전체가 다 문제 되는 단점도 있다.
댓글