# Learning Node.js Server-Side JavaScript 라 불리우는 Node.js 를 배워봅시다. JavaScript 언어 특성을 server 에 적용하면 무엇이 좋을까나? 무엇이 나쁠 수 있고? 간단하게나마 server 에 대해 알고 있어야 이해가 쉬울듯. PHP 같은 것으로라도 간단히 이런것에 대해 조금 이해해 놓는것이? 이거랑은 상관없나? Egoing 님 php 강의에서 server 가 어떤 데이터들을 보내고, client 가 어떤 데이터들을 보내고 받는지 등을 이야기한 동영상이 있었는데... 그것만 보고와서 Node.js 를 공부해도 조금 이해가 편할듯. ## PH
  • 2016-04-11 : To SEE.
  • 2014-05-22 : First posting.
## TOC ## 장단점 Node.js 의 장단점을 잘 정리해 놓은 페이지 가 있어서 대부분 여기서 인용. ### 장점
  • "상대적으로 CPU Intensive 한 작업이 없고, 많은 Connection 을 동시에 처리해야 하는 시나리오 대해서는 아무래도 node.js 의 성능이 압도적으로 높다."
  • "자바스크립트 기술을 가지고 서버 백엔드를 개발할 수 있게 되었으며, 기존의 자바 프로그래밍등과 같은 서버 개발 언어보다 훨씬 높은 생산성을 보여준다."
  • "HTML 5 의 웹소켓이 좋은 기술이기는 하지만, 브라우져 호환성의 문제가 있는데 반해서, socket.io 는 웹소켓을 포함한, AJAX 롱폴링 등 여러개의 웹푸쉬를 abstraction 하여, 브라우져에 상관 없이 개발자가 쉽게 socket.io API 만 이용하면, 푸쉬를 구현할 수 있게 해주며, 싱글 쓰레드 기반의 멀티 플랙싱을 기반으로, 대용량 사용자에 대한 푸쉬 처리를 가능하게 해준다."
### 단점
  • "기본적으로 Single thread 모델이기 때문에, 하나의 작업 자체가 시간이 많이 걸리면, 전체 시스템의 성능이 아주 급격하게 떨어진다."
  • // Single-thread vs Multi-thread. 여기서 말하는 multi-thread 는 connection 마다 하나의 thread 를 주고 여러 connection 을 동시에 처리하는 것을 말하는듯. (connection-based multi-thread?) Event-driven 으로 돌아가더라도 multi-thread 로 돌아가게 할수도 있을거 같은데... cpu/memory-based multi-thread 같은? (내가 개념을 잘못알고 있나? 공부 좀 해봐야할듯.) 그리고 엄밀히는 node.js 가 single-thread 라기 보단 그냥 event-driven 이 더 정확한 표현같기도 한데. (event-driven, callback, event emitter, event listener 등등)
  • "자바나 다른 언어에 비해서 명시성이 떨어지기 때문에, 코드의 가독성이 자바언어에 비해서 상대적으로 낮기 때문에 유지 보수가 어려워질 수 있으며, 이벤트 Call back 을 형태를 기준으로 하기 때문에, 이러한 call back 이 중첩될 경우 (이를 callback hell 이라고 한다.) 코드의 가독성이 급격하게 떨어진다. (이를 해결하기 위한 프레임웍들이 있다.)"
  • "스크립트 언어의 특성상 해당 코드가 수행이 되어야 코드에서 에러가 나는지를 확인할 수 있고, 에러가 날 경우 프로세스 자체가 내려가기 때문에, node.js 를 사용하는 사람들에게 가장 많이 들려오는 단점이 '잘 죽어요.'이다."
  • "Single thread 모델이기 때문에, 멀티 코어 머신에서 CPU 사용을 최적화할 수 없다는 문제가 있다. 하나의 쓰레드는 하나의 물리적 코어밖에 사용하지 못하기 때문제 코어가 많은 시스템이라도 성능이 올라가지 않는다 그래서 설계시, Cluster 모듈등을 이용하여, 하나의 서버에서 여러개의 노드 프로세스를 사용하는 모델을 가지고 가야 하며, 또한, 세션등을 공유할 경우, 세션 공유용 redis 와 같은 부가적인 인프라가 필요하다."
  • // Node.js 자체가 cpu/memory-based multi-thread 가 가능하도록 진화하면 해결되는 문제같은데... 곧 진화하지 않을까???
  • "Node.js 는 V8 엔진을 기반으로 하는데, 이 V8 엔진은 Garbage collection 기반의 메모리 관리를 하기 때문에, GC 시 CPU 사용률이 Spike 를 치면서 순간적으로 서버를 멈추게할 수 있다는 문제점을 가지고 있다."
  • "확장 모듈 관점에서도, Single Thread 기반의 비동기 IO 를 지원해야 하기 때문에, 노드 전용 모듈을 사용해야 하는데, 예를 들어 MySQL Connection Pool 과 같은 경우에도 기존의 자바 기반의 dbcp 와 같은 connection pool 에 비해서 고급 기능이 적기 때문에 세밀한 High availability 구현등에는 한계를 가지고 있다."
  • "프로그래밍 컨셉을 기존의 컨셉에서 Event 기반의 프로그래밍 컨셉으로 전환하는데 많은 시간이 걸릴 수 있다. 코드를 순차적으로 실행하는 것이 아니라, 비동기 방식으로 이벤트를 보내놓고, 그 응답에 대한 이벤트가 오면 핸들러를 통해서 처리 하는 형식이기 때문에, 기존 서버 프로그래밍 모델과는 많은 차이를 보인다."
  • // 이건 뭐 이런 모델이 trade-off 후에도 장점이 많다면, 프로그래머가 극뽁해야하는 부분이고.
  • "node.js 의 async io 구현 부분은 os 의 multiplexing library 를 사용한다. 윈도우즈의 경우 iocp 를, Unix 계열의 경우에는 select, epoll, kqueue 등을 사용하는데, 각각의 장단점과 성능적인 차이를 가지고 있다. 그래서, 운영하고자 하는 OS에 따라서 OS 설정이 다르고, 또한 multiplexing 라이브러리에 따라서 성능이 차이가 나기 때문에, node.js 운영전에, 운영할 OS 에서 테스트 및 튜닝을 해보기를 권장한다."
### 종합 "개발 관점에서는 빠르고 쉬운 장점이 있지만, 반대로 운영 관점에서는 테스트, 장애 대응, 디버깅등에 대해서는 신경써야 할 부분이 훨씬 더 많다. 이런 단점에도 불구하고 탁월한 생산성과 이미 상당히 커진 커뮤니티와 에코 시스템에서 오는 장점 때문에, 널리 사용되고 있고 앞으로도 널리 사용될 것으로 보인다. 기존의 자바, 스프링, WAS 와 같은 생태계가 node.js 기반으로 자바스크립트 쪽에서 새롭게 생성되고 있는 느낌이라고나 할까?"  를 보면 다른 server-side 언어들과 비교해봤을때 그렇게 성적이 좋아보이지는 않는데... 특성을 제대로 못살린건가? Node.js 가 돌아가는 방식 상으로 보면, request/response 에 필요한 CRUD (Create, Read, Update, Delete) 처리시간이랑 CPU 처리시간이 비슷한 경우에 최적의 성능을 낼거 같긴 한데... 이 둘의 속도 (1 request/처리시간) 가 다를 경우는 더 느린쪽 속도에 따라 처리될테고. PHP 나 Node.js 모두 server 의 computing resource 를 최대한 쓸 수 있다고 한다면, node.js 방식이 조금은 더 빠를거 같긴한데... Single thread 로는 최대한 못써서 문제일듯도. 특정 상황 (대충 blocked I/O 이 처리되는 시간동안 이후 명령어들이 대부분 cpu만으로 처리 가능할때) 에서는 확실히 장점이 있긴 한듯함. 그래도 최고의 성능을 원한다면 node.js 보단 vert.x (with Java) 쪽을 쓰는것이 맞을거 같은데, 아직 개인적인 확신이 100%까지는 아니고 =ㅇ=;;; ## 설치 공식 홈페이지 에 가서 본인 OS 에 맞는 파일을 다운 후 설치하면 끝. 윈도우에서는 설치후 cmd 창에서 node --version 을 치면 잘 깔렸는지 확인할 수 있음. ## Hello World hello.js 파일을 다음과 같이 만들고 ``` console.log("Hello World!"); console.log(1+10); ```/ cmd 창에서 node hello.js 을 입력하면 실행됨. webserver.js 를 다음과 같이 만들고 ``` const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); }); ```/ 같은 방식으로 실행하면 서버가 실행됨. ## RRA

    Official

  1. nodejs.org; and Node.js v0.10.28 Manual & Documentation, 2014-05-01, Version 0.10.28 (Stable)
  2. http://expressjs.com/
  3. Introducing Node.js

  4. YUI Theater - Ryan Dahl (the creator of NodeJS): "Introduction to NodeJS" (58 min. video), 2010-05-20;
    // Node.js 의 Disign Goals/Philosophy, 특성 등을 간략히 설명. JavaScript의 non-blocking I/O, asynchronous, closures, event-driven, callback function, anonymous functions 같은 특성을 잘 활용하면 특정상황/서비스에서 server 쪽 성능이 꽤나 향상되는듯? Case by case 같기도 하고... 아무튼 JavaScript 의 여러 특성들을 server-side 에서 쓰려고 만든게 Node.js 인듯.
  5. code.tutsplus.com - Learning Server-Side JavaScript with Node.js, 2010-03-15, by Devon Govett;
    // 오래된 글이긴 하지만, 괜찮은 introducing 인듯. 단, Example code 가 outdated 라 댓글보면서 조금 고쳐야 돌아가는듯함. 아무튼, 예제가 참 좋은듯. 너무 쉽지도 어렵지도 않고, Node.js 의 특성 (특히 event-driven) 을 잘 보여주는듯한.
  6. bcho.tistory.com - node.js의 장단점에 대해서, 2014-03-09, by 조대협; and 빠르게 훝어보는 node.js #1 - node.js 소개 및 내부구조, 2014-03-17; #2 설치와 개발환경 구축, 2014-03-20; and #3 Event,Module,NPM, 2014-03-25; and #4 웹개발 프레임웍 Express 1/2, 2014-04-01; 등등등 계속 글을 쓰시는듯.
    // Node.js의 장단점 및 non-blocking I/O, callback 개념 등이 잘 설명되어 있음. 이건 JavaScript 특징이기도 한.
    // bcho.tistory.com - Category - '클라우드 컴퓨팅 & NoSQL/Vert.x & Node.js' 글들이 다 볼만함. (단, 글씨 크기가 너무 작아서 보기가 불편. 좀 늘려주셨으면 좋겠는데...)
  7. Outsider's blog - node.js는 무엇인가? #1, 2010-06-06; and node.js는 무엇인가? #2 : Hello World 실행하기, 2010-06-06;
    // 전문(?)언어가 많아서 처음 접하는 사람이 이해하기는 조금 난해한듯도. 그래도 한글 페이지이고 설치부터 간단한 예제까지 잘 정리해 놓으신듯.
  8. Tutorials

    이것저것 tutorial 추천사이트가 많긴한데, 잘 골라봐야할듯.
  9. cafe.philgo.com - 강좌 : 자바스크립트 - 3편, 노드 Node JS
  10. https://opentutorials.org/course/2136 - JavaScript (nodejs)
  11. Page showing url Lists

  12. Stack Overflow.com - How do I get started with Node.js?, 2013-01-13, asked by Joneph O.;
    // Many Lists of urls.
  13. Community

  14. How to Node.org
  15. github.com - Node.js community wiki
  16. Modules (similar to C library/package concept which can be imported/included.)

  17. Node Packaged Modules
  18. Competition with other server-side languages

  19. Tech Empower.com - Web Framework Benchmarks - Round 9 (2014-05-01) - Multiple queries
    // 그닥 성적이 좋지는 않은듯도. "Ctrl+F"로 "node"를 검색해 보시길. 최고 대비 50% 미만의 성적. JavaScript의 특성인 closures 같은 것들때문에 (이런 특성이 안쓰일때에도 프로그램이 돌아갈때는 이런걸 다 check하면서 진행할테니) 느려지는듯도? 컴파일 없이 인터프리터로 실행해서 그런듯도하고... (맞나? php도 인터프리터로 실행하는거 같기도 한데... 둘 다 컴파일 이후 실행시킬수도 있을것도 같고.)
  20. kipid's blog - Learning Vert.x, 2014-05-23;
    // 가장 비슷한 다른 server-side 언어가 vert.x 일듯? Vert.x 자체가 node.js로부터 영향을 받은 프로젝트이기 때문에 node.js의 많은 장점들을 가져와서 구현했을듯. JVM (Java Vertual Machine) 에서 돌아가기 때문에 "Java, JavaScript, Python, Groovy, Scala" 등 node.js보다 다양한 언어가 지원된다고. (그런데 바로 위 링크에서의 vert.x 성적도 좋지 않던데... 대충 생각해볼때 이게 가장 강력할것도 같은데 이상함.)
저작자 표시 비영리 변경 금지
신고
Posted by 냥냥 kipid
comments powered by Disqus