잡담소장소

What is Node.js ? 본문

Study ;3

What is Node.js ?

알 수 없는 사용자 2012. 12. 4. 14:11

 

라는 제목으로 기밀태씨가 보내준 메일.

내가 검색해서 알아본 내용 중 가장~~ 이해하기 쉽게 잘 설명해주었다 ;ㅂ;

능력자 인정!! ;ㅂ;

 

 


 

 

전통적인 방식의 네트워크 서버에서 발생할 수 있는 가장 큰 오버헤드는 다음 두가지다.


1. I/O Blocking
작성된 코드를 순차적으로 실행시키는 전통적인 프로그래밍의 경우, 프로세스는 I/O작업을 시스템에 요청한 후 작업이 끝나는 것을 기다리게 된다. 이를 Blocking이라고 하며, 혹은 이러한 작업을 Synchronous(동기적)이라고 표현한다.
I/O는 CPU나 메모리에서 일어나는 코드의 수행에 비해 상대적으로 훨씬 느린 미디어를 대상으로 작업하므로, I/O가 빈번히 일어나는 경우 시스템은 코드를 실행하는 것보다 훨씬 많은 시간을 I/O 작업을 기다리는 데 낭비하게 된다.
이를 해결하기 위해 Asynchronous(비동기적)인 여러가지 해결책들이 도입되었으나, 어느 방식이나 순차적인 코드 수행에 비해 코드의 작성이 매우 까다로운 단점이 있다. 비동기 방식은 I/O작업을 요청하는 함수와 I/O작업이 완료되었을 경우 이를 전달받는 콜백 함수가 분리되는데, 이는 순차적으로 코드를 읽어나가는 것에 편안함을 느끼는 사람으로 하여금 코드를 쓰고, 읽고, 수정하는 일을 불편하게 만든다. 또한, 작업을 요청하기 전에 가지고 있던 데이터들을 작업이 끝났을 때에도 온전하게 가지고 있도록 코드를 작성하는 것은, 여러개의 비동기적인 I/O작업이 일어나 코드가 복잡해질수록 대단히 까다로운 작업이 된다.

2. Context Switch
위와 같이 Blocking은 CPU가 I/O를 넋놓고 기다리게 하는 문제가 있기 때문에, 대다수의 시스템은 이러한 작업을 수행하는 프로세스(흔히 Worker)를 여러개 두게 된다. 다수의 프로세스가 동시에 실행됨으로써, 하나의 프로세스가 I/O 작업을 기다리는 도중에 다른 CPU는 I/O가 필요하지 않은 작업을 수행하여 CPU의 사용 효율을 극대화하는 것이다. 이를 Context Switch라고 하는데, 이때 CPU는 현재 수행중이던 프로세스의 정보를 메모리에 저장하고, 다른 프로세스를 수행하기 위해 필요한 정보를 CPU에 로드하게 된다. 이로 인해 발생하는 비용을 Context Switch라고 하며, 순수한 오버헤드의 대표적인 사례이다. 프로세스가 많아질수록 CPU는 많은 프로세스 사이를 돌아다녀야 하므로 이러한 오버헤드는 점점 커져, 실제로 코드의 수행에 투입되는 CPU의 효율이 급격하게 줄어들게 된다. 따라서 오늘날 대부분의 서버는 프로세스를 경량화한 스레드를 사용하며, Thread Pooling 등의 기법을 동원하고, Worker의 수를 적절하게 통제하여 CPU가 낭비되는 것을 막기 위해 노력한다.

node.js는 위의 단점들을 극복하기 위해 만들어진 시스템 중 가장 급진적인 아이디어라 할 수 있다. node.js는 100%비동기로 작동하며, 하나의 서비스가 단 하나의 프로세스만으로 수행된다. (현재는 CPU의 코어 수 만큼의 프로세스를 사용한다.)
즉 Context Switch로 인한 CPU자원의 낭비도 없을 뿐더러, Blocking으로 인한 유휴 시간도 전혀 없다. 기존에 Blocking이 일어나던 모든 I/O 작업은 작업을 요청하고, 작업이 완료되면 콜백이 실행되는 형태(node.js의 개발자들은 이를 event-driven이라고 표현했다. 실제로 자바스크립트의 이벤트 모델을 이용하긴 한다.)로 이루어진다.
그러면 한가지 문제가 남는다. 1번의 예에서 서술했듯이, 비동기 코드는 작성하기가 까다롭다. node.js는 어떻게 이러한 문제를 해결했는가? 이것이 node.js의 개발자들이 굳이 자바스크립트를 기반 언어로 선택한 3가지 주된 이유 중 첫번째이다. 자바스크립트는 inline anonymous function(익명 함수, lambda expression이라고도 한다)을 지원하는데, 이름은 길지만 jQuery를 사용하는 개발자라면 누구나 흔히 쓰는 표현식이다. 아래의 jQuery코드를 보자. 

 
function test()
{
     var str = 'hello!';
     $("div").click(function(e)
     {
          $(this).html(str);
     });
}
위의 코드는 매우 단순하지만, 실제로 node.js를 이용하기 위해 필요한 대부분의 테크닉이 포함되어 있다. div.click을 등록하는 것이 I/O작업의 요청이라고 생각해 보자. 자바스크립트의 익명 함수는 호출된 scope 내의 모든 변수를 기억하고 있기 때문에 상태 유지의 문제가 없으며, 익명 함수를 사용하므로 비동기임에도 불구하고, 사람이 읽는 순서대로 코드가 작성됨을 보장할 수 있다. node.js의 코드는 다음과 같이 작성된다.

function code()
{
     call_db(function(e)
     {
          // DB 수행 처리
          var val = do_something(e.data);
          call_memcache(function(e2)
          {
               var text = do_something(val, e2.data);
               display_response(text, function(e3)
               {
                    ...
               }
          }
     }
}

위의 짧은 코드를 실행하면, 6번의 비동기 함수 호출과 3번의 콜백 함수 호출이 일어나지만 사용자는 파생된 데이터를 별도로 관리할 필요도 없고, 해당 코드가 어느 순서로 실행되는지 혼란스러워할 필요도 없다. 위의 코드는 명백하게, code() -> call_db() -> do_something() -> call_memcache() -> do_something2() -> display_response() 순으로 실행된다. 비동기 처리를 위해 많은 공을 들여야 했던 기존의 언어들과는 비교할 수 없을 만큼 쉽고 직관적이다. 만일 위의 코드를 C로 작성한다면 코드의 양은 훨씬 늘어나며, 코드의 가독성도 훨씬 떨어질 것이다.

자바스크립트를 사용하는 두번째 이유는, 스피드다. 자바스크립트는 모든 웹 브라우저에서 실행되는 언어로, 세계에서 가장 큰 3개의 IT기업들(마이크로소프트, 애플, 구글)이 수년간 전력을 다해 자바스크립트의 실행 속도를 개선해 왔다. node.js는 이들 중 크롬에 탑재된 V8엔진을 사용한다. 이 엔진의 성능과 견고함은 의문의 여지가 전혀 없다.

세번째 이유는, 개발자들 스스로가 밝혔듯이, 이미 세상에는 자바스크립트 개발자가 매우 많다는 점이다. node.js를 사용하기 위해 새로운 언어를 배워야 할 개발자는 아마 거의 없을 것이다.

node.js는 기본적으로 자바스크립트 엔진 위에 간단한 네트워크 및 디스크 I/O를 얹은 것에 불구하다. 그러나 자바스크립트의 특징과 서버측에서 요구되는 성능의 조합으로, node.js는 기존과는 비교도 할 수 없는 강력한 위력을 가지고 있으며, 아직까지도 실험적인 프로젝트임에도 불구하고 많은 기업과 개발자들이 node.js에 열광하고 있다.

node.js는 그 자체만로는 바로 사용하기엔 너무나도 단순하기 때문에, npm(Node Packaged Module)이라는 모듈 방식을 제공하여 많은 개발자로 하여금 node.js 기반의 서비스 모듈을 개발하고 공유하도록 독려하고 있다. node.js를 처음 이용해야 하는 개발자가 할 일은, npm의 repository인 https://npmjs.org 에 방문하여 자신의 목적에 맞는 모듈을 찾아내고 설치하는 일이다. 몇개의 주요 모듈을 설치하고 약간의 코드를 쓰는 것만으로도, 기존의 서버들로는 어려웠던 수많은 일을 할 수 있다.

 

 


 

열심히 공부할께요 ;_; 흐그....

 

반응형

'Study ;3' 카테고리의 다른 글

MySql Workbench  (0) 2013.01.24
유용할 것 같은 jQuery Plugin  (0) 2013.01.09
SyntaxHighlighter Test  (0) 2012.07.20
기밀태씨 강의  (0) 2012.06.05
리마인드용 개발 이야기  (0) 2012.05.08
Comments