Node.js 개요

노드JS는 서버프로그래밍용 자바스크립트입니다. 웹브라우저에서 사용하던 자바스크립트를 서버에서 그대로 사용할 수 있습니다.

CommonJS 에 대해

CommonJS는 ‘웹브라우저 밖에서 자바스크립트를 사용하려면 이렇게 해야 한다.’와 같은 표준입니다. 그리고 노드는 이 표준을 따르고 있습니다. 최신 버전의 jQuery도 CommonJS를 지원하면서 자바스크립트에서 CommonJS가 차지하는 비중이 늘어나고 있습니다.

케빈 댕구어(Kevin Dangoor)가 2009년 1월에 시작한 프로젝트이고 ‘자바스크립트는 더 이상 브라우저만을 위한 기술이 아니다!’를 모토로 하고 있습니다.

일반적으로 웹브라우저에서는 <script> 태그로 자바스크립트 파일을 불러오는데, 다른 환경에서는 HTML 파일이 없으므로 이렇게 파일을 불러올 수 없습니다. 그래서 자바스크립트를 모듈화하고 각 파일들이 서로를 호출하고 참조하는 방법이 필요한데 CommonJS가 이런 방법을 표준화하고 있습니다. (W3C의 표준화 조직은 아니지만 사실상 산업 표준이 되었습니다.)

현재 모듈, 패키지, 시스템에 대한 표준이 결정되었고 바이너리, 단위 테스트, 파일시스템 등의 표준이 제안 상태에 있습니다.

Node.js 발전 과정

노드JS는 라이언 달(Ryan Dahl)이 2009년 2월 9일 V8엔진(크롬 웹브라우저 자바스크립트 엔진)을 이용해 개인 프로젝트로 시작을 했습니다.

현재는 200여명이 넘는 개발자가 오픈소스 프로젝트에 참여중이고 창시자(라이언 달)를 포함해 7명의 커미터가 새 기능의 적용 여부를 결정합니다. 0.3 버전부터 홀수버전이 개발버전이고 짝수 버전은 안정버전입니다. 그래서 애플리케이션을 개발할 때는 짝수 버전을, 새 기능을 테스트하고 싶을 때는 홀수 버전을 사용하는게 좋습니다.

노드JS는 유닉스 계열 운영체제에서 만들어졌습니다. 하지만 0.6 버전부터는 윈도를 지원합니다.

Node.js 특징

이벤트 루프 기반의 비동기 I/O

노드JS는 I/O를 비동기 방식으로 처리합니다. 이벤트에 콜백 함수를 등록하고 나머지 코드를 이어서 처리하며, 이벤트가 발생하면 이벤트 루프가 이를 감지하고 콜백 함수를 실행시킵니다. 그리고 이벤트 루프는 다시 이벤트를 기다리는 상태가 됩니다.

싱글 스레드

아파치 같은 웹서버는 멀티스레드 기반입니다. 요청이 들어온 만큼 스레드를 생성하기 때문에 동시 접속자수가 늘어날 경우 성능이 급격히 저하됩니다. 반면 노드JS는 싱글스레드와 이벤트 루프 방식이어서 외부 자원을 사용하는 작업을 모두 위임시키고 직접 처리할 수 있는 작업만 합니다. 그래서 동시 접속자수가 늘어나더라도 성능이 크게 저하되지 않습니다.

단점은 현재 처리중인 작업이 CPU를 많이 사용할 경우 다음 이벤트가 처리되지 않는다는 것입니다.

자바스크립트

자바스크립트는 함수를 퍼스트 클래스 객체로 다루므로 함수를 파라미터로 전달할 수 있어 이벤트 기반 프로그래밍에 적합한 언어입니다. 그래서 자바스크립트에 익숙한 웹개발자들이 노드JS에 비교적 쉽게 접근할 수 있습니다.

노드JS는 자바스크립트를 실행하기 위해서 크롬 웹브라우저 엔진인 V8을 사용합니다. V8은 다른 브라우저의 엔진보다 빠르다고 알려져 있습니다.

Node.js 장점

  • 빠른 속도: 이벤트 루프, 넌블록킹 I/O로 인해 성능이 좋습니다.
  • 쉬움: 자바스크립트에 대한 지식이 있는 경우 노드JS에 대한 진입장벽이 낮습니다.
  • 메모리 사용이 적음: 싱글스레드로 동작하므로 멀티스레드 방식에 비해 메모리와 시스템 자원을 적게 사용합니다.

Node.js 단점

  • 성능확장의 어려움: 서버의 개수를 늘리거나 하드웨어의 성능을 업그레이드 하더라도 노드JS의 퍼포먼스가 많이 좋아지지 않습니다.(싱글 스레드를 사용하기 때문) – 여러개의 노드JS 인스턴스를 실행해 서로간 통신을 하여 해결 가능합니다.
  • 짧은 역사: 노드JS는 나온지 오래되지 않아 실제 서비스에 적용된 레퍼런스가 많지 않습니다.