본문 바로가기

node.js (OctoberSkyJs)

[Node.js 따라배우기] 그래서, Node.js는 무엇인가?


스터디 시작 오리엔테이션에서 링크 걸어넣고 node.js에 대한 글들을 읽어보세요! 라고 이야기 드리고 스터디를 시작했었습니다. 그런데 그렇게만 했더니, 생각보다 많은 분들이 '그런데 그래서 node.js가 뭔가요?'라고 의문을 가지시는 것 같습니다. 그래서 따라하기 스터디를 좀 더 진행하기전에 node.js의 정체에 대해 되살펴보는 시간을 가지려고 합니다. 부디, 차분히 읽어보시길 권합니다. 

마찬가지로 각종 코멘트 환영합니다. :D



한글 위키피디아의 정의

Node.js는 V8 (자바스크립트 엔진) 위에서 동작하는 이벤트 처리 I/O 프레임워크이다. 웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안되었다.

Node.js는 파이썬으로 만든 Twisted로 만든 펄 객체 환경루비로 만든 이벤트머신과 그 용도가 비슷하다. 대부분의 자바스크립트가 웹 브라우저에서 실행되는 것과는 달리, Node.js는 서버 측에서 실행된다. Node.js는 일부 CommonJS 명세를 구현하고 있으며, 쌍방향 테스트를 위해 REPL 환경을 포함하고 있다.

* CommonJS에 대해서는 따로 포스팅을 통해 설명드릴게요.
 


Node Beginner's Guide의 정의

Node.js는 실질적으로 서버사이드 자바스크립트 실행환경라이브러리, 이렇게 두 가지로 이루어져 있습니다.



Nodejs.org 사이트의 설명

Node의 목표는 확장이 용이한 네트워크 프로그램을 쉽게 만들 수 있도록 방법을 제시하는 것입니다. "hello world" 웹서버 예제는, 많은 클라이언트 연결을 동시적으로(concurrently) 다룰 수 있습니다. Node는 새로운 커넥션이 만들어질 때, 해당 내용에 대해 통지를 받아야 하는 운영체계에 (epoll, kqueue, /dev/pool, 혹은 select같은 것을 통해) 알려준 다음, 대기상태로 들어갑니다. 만약 누군가가 새로운 연결을 하면, (다시) 콜백을 실행합니다. 각각의 연결에 있어 단지 작은 힙 (메모리) 할당만 일어납니다.

이런 방식은 오늘날의 OS 스레드(thread)를 사용하는 좀 더 흔한 동시성 모델에 반대됩니다. 스레드 기반 네트워킹은 상대적으로 비효율적이고 사용하기 매우 어렵습니다. 이것 이것을 한번 읽어보세요. Node는 부하가 큰 시스템에서 각각의 연결에 2mb의 스레드 스택을 사용하는 시스템 보다 메모리 효율이 훨씬 좋습니다. 더욱이, Node의 사용자들은 프로세스 데드락 걱정에서 자유롭습니다. (Node는 Lock이란 게 없습니다.) Node에는 I/O를 직접 수행하는 함수가 거의 없습니다. 그렇기 때문에 프로세스가 절대 블럭(block)되지 않습니다. 블럭이 없기 때문에, 전문가가 아닌 프로그래머들도 빠른 속도의 시스템을 개발할 수 있습니다.

Node는 루비의 이벤트 머신(Event Machine)이나 파이썬의 트위스티드(Twisted) 같은 시스템에 영향을 받았고 유사하게 설계되었습니다. 다만 Node는 조금 더 발전된 이벤트 모델을 취합니다. 라이브러리 같은 방식 대신에 마치 언어 구조(language construct)처럼 이벤트 루프 기능을 제공합니다. 전형적 형태로는, 스크립트 시작부분에 콜백으로 행위를 정의하고, 끝부분에 EventMachine::run() 같은 블록킹 콜을 호출해서 서버를 시작합니다. Node에서는 이벤트-루핑-시~작! 같은 것이 없습니다. Node는 입력받은 스크립트를 실행한 다음, 간단하게 다시 이벤트 루프에 빠집니다. Node는 더 이상 수행할 콜백이 남아있지 않을 때 이벤트 루프를 빠져나옵니다. 이런 동작은 마치 사용자에게는 보이지 않는 브라우저상의 자바스크립트 이벤트 루프와 유사합니다.

HTTP는 Node의 퍼스트 클래스 프로토콜입니다. Node의 HTTP 라이브러리는 저자의 웹 서버 개발 경험과 작업 경험을 넘어서서 점점 성장하고 있습니다. 예를 들면, 대부분의 웹 프레임워크에서 데이터를 스트리밍하는 일은 불가능합니다. Node는 Node 자신의 HTTP 파서와 API에서 이런 문제들을 해결하기 위한 시도를 했습니다. Node의 순수한 이벤트처리 기반구조와 연결하면, 웹 라이브러리나 웹 프레임워크를 위한 좋은 기반을 만들어 냅니다.

하지만 멀티 프로세서 동시성 처리의 경우는 어떤가요? 멀티 코어 컴퓨터용 프로그램들을 확장하기 위해서는 스레드들이 필요하지 않을까요? child_process.for()를 통해 프로세스들을 시작할 수 있습니다. 그러면 다른 프로세스들이 병렬로 처리하려 할 겁니다.


이게 node.js의 정체입니다. '무슨소리!! node.js는 그게 다가 아니라고!'라고 말할 수도 있지만, 그건 node.js와 node.js가 만들어낸 에코시스템을 혼동하는 겁니다.

자, 조금만 더 살펴보겠습니다. 이하는 저의 개인 의견입니다. :D
 

Node.js에 대한 오해와 진실
 

1.Node.js는 프론트앤드 개발이다!
- 아닙니다. 노드는 자바스크립트 언어를 쓸 뿐이지 서버사이드 개발입니다. Node.js를 만든 라이언 달(Ryan Dahl)도 서버 개발자입니다. 그것도 아주 코어한.

" In the past year I think I have finally come to understand the ideals of Unix: file descriptors and processes orchestrated with C" - 
Ryan Dahl


2.자바스크립트를 주로 하던 프론트 앤드 개발자가 이제 쉽게 서버 개발을 할 수 있다!
- 아닙니다. 프론트 앤드 개발을 하던 개발자에게 자바, 아파치, 톰캣 등등을 배우지 않고 서버 개발, 그 중에서도 I/O 특화된 개발을 할때 좀 더 쉬운 환경을 제공하지만, 역시 I/O및  서버사이드 기술 개념을 학습하지 않으면 제대로된 개발을 하기 어렵습니다. 무슨말인가 하면, node.js 공식 사이트 문서 페이지의 API 이름들을 살펴보시면 바로 이해가 되실겁니다.
 


3.Node.js가 대 유행이다!

아래는 javascript, node.js, python, ruby에 대한 구글 트랜즈입니다.

비교 영역이 잘못됐잖아! 라고 말할 수도 있겠습니다만, 어쨌든 사람들이 찾는 빈도를 보시만, python이 0.35일때 node.js는 소수 두자리까지 이하의 수준입니다. 우리 주변에 python 쓰는 사람이 몇이던가요? 
 


4.그럼 왜 배우냐??
- 가능성에 대한 투자입니다. 그리고 지식영역의 확장을 위해서입니다. node.js는 그 자체도 자체지만 node.js가 만들어낸 플랫폼과 에코시스템의 성장이 예사롭진 않습니다. 특히 npm과 더불어 I/O를 사용하는 서버모듈의 개발과 설치가 매우 간편해졌습니다. 그리고 성능도 괜찮고요.
하지만 현실에서 이걸 얼마만큼 쓰게 될지는 말 그대로 미지수입니다. 그럼에도 투자해 볼만한 가치가 있다고 생각합니다. 
 


5. node.js의 최고 장점은 성능 아닌가요?
- 물론 몇몇 벤치마킹에 의하면 node.js의 성능이 뛰어난 건 맞습니다. 하지만 예전에 mysql이 처음 나왔을때를 떠올려보면 그 때도 그랬습니다. mysql이 단순 트랜잭션처리가 오라클에 비해 수 배에서 수 십배까지 좋게 나왔었습니다. 하지만 성능때문에 mysql을 쓰겠다며 바로 넘어가는 경우는 드물었습니다. 만약 아파치 웹 서버보다 50%쯤 빠른 서버가 나온다면 사람들이 다 그 서버로 옮길까요? 아마 그렇다 하더라도 한동안은 아닐겁니다. 마찬가지입니다. node.js를 서버 성능으로만 놓고 따르려 한다면 위험한 생각일 수 있습니다. 엔지니어라면 대부분 약간씩은 성능지상주의 성향이 있긴 하지만, 성능만으로 node.js를 평가한다면, 만일 더 나은 성능의 무언가가 자바같은 메이저(=사람이 많은) 쪽에서 나온다면, 그 순간 가치가 급락해 버릴겁니다. (제 생각엔) node.js는 기반시스템으로 놓고 접근해야 합니다. (자바스크립트로 I/O를 다를 수 있다는 건 엄청난 매력이니까요.) node가 스스로를 하부로 시스템의 일부로 내리고, npm과 함께 에코시스템을 구축해서 확장의 문을 열어놓은 것은 매우 훌륭한 선택이었다고 봅니다.

참고로, Node.js 생태계에서 구축된 모듈들은 아래 페이지에서 확인 가능합니다.
https://github.com/joyent/node/wiki/modules


자! 이런저런 이야기들에도 불구하고, 당분간은 신기하고 재밌을 겁니다. 왜냐하면 어쨌든 새로운 세상이기 때문입니다! :D

참고로 다음 강좌가 곧 올라옵니다. 진도 챙겨주세요! 아!! 천천히 따로 하신다고요? 에이~ 다 같이 할때 함께 진행하세요~ 밀리면 초등시절 방학숙제 마냥 감당 안됩니다~ ㅎ~

광고!

온라인 스터디 도와주실 분을 찾습니다.
 

- facebook에 있는 스터디 페이지 함께 관리
- 댓글 관리 (진도댓글 확인하고 좋아요 눌러주기 같은) :D 
- 관련 아티클 번역 

댓글이나 메일로 알려주세요!
 

혜택은? 음.. 책 선물? 오프라인 모임때 일정맞춰 드리기? 음.. 여튼 좋은 혜택 드릴 수 있도록 좀 더 고민해 보겠습니다. ^^;;