Page tree
Skip to end of metadata
Go to start of metadata

node js

  1. nodejs 는 누가 무엇을 목적으로 개발했을까?
  2. nodejs 가 가지는 특징
  3. nodejs 로 심플하게 웹서버를 만들어보자.

     

nodejs 는 누가 무엇을 목적으로 개발했을까?

 우리에게 공부거리를 주신 ryan dahl

nodejs 는 라이언 달(ryan dahl)이 서버개발환경을 목적으로 개발한 것입니다.


우선 본격적으로 들어가기에 앞서 C10K 문제를 짚어보겠습니다.
C10K 문제는 많은 수의 클라이언트 동시접속에 대해 I/O 문제를 안고 있습니다.
기존의 멀티쓰레드 방식은 쓰레드풀 안에 많은 쓰레드에게 일을 시키는 방식이었습니다.
이러한 방식은 I/O등에서 가지는 병목현상을 일으키는 주범이 됩니다.
하나의 I/O등의 자원에 수많은 쓰레드들이 목적을 가지고 접근이 발생함으로 생기는 문제인데 자원을 선점한 쓰레드가 일을 처리하기 전까지 대기하는 일이 발생하고 이 대기하는 일이 수많은 쓰레드들이 동시에 가지게 되면서 시스템 전반이 느려지는 경험을 가지게 되지만, 실제로 CPU는 놀고 있는 등의 비효율적인 문제가 생기게 됩니다.


위의 문제는 사실, os차원의 I/O모델에서 오래전에 대두되었었습니다.
이를 처리하기 위한 대안으로 나온 것이 비동기 방식입니다.
unix 계열의 os 가 지원해주는 I/O모델은 크게 비동기, 동기(블럭킹, 넌블럭킹) 으로 나뉩니다. 
windows 계열에서는 이미 IOCP 라는 proactor 패턴을 적용한 이벤트 기반 비동기 I/O 처리 모델이 있습니다. 여기서 proactor 패턴은 콜백 개념을 착안합니다.
이처럼 이미 웹 이전에 os에서 I/O 처리의 효율에 문제점이 대두되었고 각 os는 이를 해결하기 위해 비동기 방식을 적용하였습니다.


nodejs 는 비동기 통신을 하는 javascript 언어로 개발된, 메이저 브라우저중 가장 빠르다고 평가받는 크롬의 엔진인 V8 을 포팅한 프로그래밍 언어입니다.
때문에, 크롬을 개발하여 서비스하는 구글이 망하지 않는 이상 계속 업데이트 되며 발전하는 V8 을 따라 같이 발전하겠죠? (아마?)

라이언달은 I/O에 따르는 비효율에 대해 고민을 하던 차에 브라우저가 가진 이벤트 기반 프로그래밍이 os차원의 I/O모델이 가지고 있던 문제도 해결되게끔 잘 설계된 걸 이해하게 되었고, 거기에 이벤트 루프, 넌블럭킹 I/O, 콜백 개념에 대해 고민하며 언어 디자인 설계를 세우게 됩니다.

nodejs 가 가지는 특징

  • 디자인 목표

-  어떤 함수도 I/O를 직접 수행해선 안 된다.

-  디스크나 네트워크, 혹은 다른 프로세스로부터 정보를 받으려면 반드시 콜백이 있어야 한다.

 -  모든 것이 스트림. 버퍼링하도록 강제하지 않는다.

 -  POSIX(유닉스 운영체계에 기반을 두고 있는 일련의 표준 운영체계 인터페이스) 레이어에서 제공되는 기능을 제거하지 않는다. 이를테면 half-closed TCP 연결지원 같은 기능을 제거하지 않는다.

 -  가장 중요한 프로토콜들을 위한 지원을 내장한다. (DNS, HTTP, TLS)

 -  수 많은 HTTP 피처, 즉 HTTP의 스펙으로 정한 기능들을 지원한다.

 -  API는 클라이언트 자바스크립트 개발자들과 올드 스쿨 유닉스 해커들 모두에게 친숙해야 한다.

 -  플랫폼 독립적이다.

 -  단순한 라이센스 (openssl 에 걸린 라이센스만 제외하고 나머지는 마음대로 쓸 수 있는 MIT 혹은 BSD 라이센스)

 -  적은 의존성 

 -  정적으로 링크

 

 

  • 아키텍처

- standard library 를 지원하는 javascript

- javascript 를 바인딩해주는 C로 개발된 레이어

- 자바스크립트를 실행해주는 V8

- 이벤트 기반의 모든게 비동기로 동작하는 C언어용 I/O 라이브러리 libeio. 기본적으로 POSIX api에 기반을 두고 있으며 파일처리 관련 작업을 한다. read, write, open, close, stat, unlink, fdatasync, mknod, readdir 등의 작업을 비동기로 처리. (참고 : http://software.schmorp.de/pkg/libeio.html)

- 다양한 기능을 가진 고성능 이벤트 루프 라이브러리 libev. (참고 : http://software.schmorp.de/pkg/libev.html , http://www.ibm.com/developerworks/aix/library/au-libev/ )

-
   

- 자바스크립트 레이어가 메인 스레드이고 한 개의 실행스택을 가짐. 하지만 C레이어에서는 여러개의 스레드를 사용할 수 있다.
  (이를테면 gzip 라이브러리를 쓸 때는 5개의 스레드로 포크해서 동시에 호출할 수 있습니다. 하지만 이건 C를 사용했을 때에 한정함)

 

 

nodejs 로 웹서버를 만들어보자.

node js 는 webserver 로 사용이 가능하다. 이 말은, 특정 포트를 통해 우리가 알고 있는 internet service 를 제공할 수 있다는 것이다.
그러나 webserver 로서의 기능을 제공한다는 것이지, webserver 가 제공하는 여러 편의는 제공하고 있지 않다.

따라서 우리가 직접 webserver 의 router, request handler 등을 구현해주어야 한다.
아래의 github 주소에서는 단계별로 nodejs 를 이용하여 꽤 그럴싸한 웹서버를 구현해 나가고 있다.

그럴싸한 웹서버를 구현해 나아가면서 non-blocking, callback 등 nodejs 의 디자인에 있어 중요한 위치를 하는 것들을 살펴보고,
그와함께 라이브러리 참조와 javascript 코드 작성방법 등을 살펴본다.

참, 아래의 github 주소에서 받은 코드들은 nodejs 가 설치된 폴더의 apps 아래에 위치시켜두고 커맨드창 등을 통해서 해당 위치까지 가서 실행하면 된다.
예를 들어 C:\nodejs\apps\20140820_nodejs_speech 에 위치하고 이 아래에 step1,2,3... 등이 위치하고 있다면.
windows 기준에서는 커맨드 디렉토리를 c:\nodejs\apps\20140820_nodejs_speech\step1 위치시켜준다.
그리고 node index.js 를 입력하면 server 가 start 되었음을 확인할 수 있다. (리눅스 사용자 분들은... 화이팅!!)

https://github.com/kimmunsu/slippstudy_nodejs_basic_tutorial 

 

대신, nodejs 는 open source 로 다양한 라이브러리 개발에 열려있고 여러 개발자들이 만든 여러 웹서버 지원 프레임워크가 있다.
express 는 그 중 하나이다. 

 

 

 

참고

http://bcho.tistory.com/865 [nodejs single thread 에 대한 오해, thread context switching 부하와 기존 웹언어의 성능차이 등 - 본문에는 해당 url로부터 얻은 정보를 첨부하지 않음]
http://www.gpgstudy.com/forum/viewtopic.php?t=2097 [c10k, kqueue, unix os 인용]
http://en.wikipedia.org/wiki/Kqueue [kqueue 인용]
https://kldp.org/node/60222 - 참고로 쓸지는 다시 한 번 읽어보자.
http://blog.outsider.ne.kr/750 [nodejs 관련된 twitter 토론 쓰레드]
https://kldp.org/node/60222 [windows IOCP]
http://algorithm.jioh.net/2010/10/%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88%EC%A0%81%EC%9D%B8-%EC%9D%B4%ED%95%B4.html [windows IOCP, 블럭킹, 논블럭킹]
https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCIQFjAA&url=http%3A%2F%2Fcfile25.uf.tistory.com%2Fattach%2F1647433750A0FC5636034E&ei=LOPdU-C_KMeD8gXW64HQDA&usg=AFQjCNEAqKF88RiRJlEmGGnfdh7iPH2MqQ&sig2=8MjBmQpMIeD9OluDjKm5AA&bvm=bv.72197243,d.dGc&cad=rjt [windows IOCP]
http://www.slideshare.net/fullscreen/doortts/ryan-dahl-nodejs-by-doortts/6 [ryan dahl 의 node.js 소개 동영상 해설]

http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb[node js 동작원리]

http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/ [EDD로 본 node.js]

  • No labels