지금으로부터 한달전 2016년 4월 29일 Node.js v6이 출시됐다. 개발하고 있는 프로젝트는 LTS 버전인 v4를 사용하고 있었다.


ES6(Ecmascript6)을 개발할 때 적극적으로 도입하고 있었고, 개인적으로 마음에 들었던 부분은 자바스크립트의 단점인 변수의 범위를 좀 더 명확하게 지정할 수 있는 Block Scope, 기존 Function는 this를 자유자재로 변조할 수 있었다. Allow Function은 this가 할당되지 않기 때문에 명확하게 개발할 수 있다. v4는 문법 지원이 미미하므로, 아쉬운 점이 많았었는데, v6에서는 v8 엔진 5.0이 지원되기 때문에 ES6 문법을 93%까지 지원하게 되므로, 업그레이드를 고려하는 큰 이유가 되었다.


다음은 성능이다. 중요한 업그레이드 내용이며, v4보다 모듈 로딩속도가 4배 정도 빠르다고 한다. 기존 문법이 호환되기 때문에, v6으로 프로젝트 전체 테스트 시 큰 문제가 없다면, 업그레이드만 진행되어도 큰 성능향상을 확인할 수 있다. 테스트 진행은 mocha를 이용했고, jenkins에 연동했었다.


NPM(Node Package Manager)는 v4인 경우 v2로 설치가 되는데, 모듈 중복 등 문제점이 여럿 발견되었다. v3에서 대부분 해결되었는데, v6 업그레이드 시 v3으로 설치가 된다.


ES6, 성능을 충족했기 때문에 버전 업그레이드를 하기로 하였고, v4 -> v6 으로 진행하였다.


참고 사이트


NPMv2, NPMv3은 Dependencies를 제공하는 방법이 다르다. NPM에서 제공되는 모듈도 추가로 모듈을 사용할 수 있는데, 그 정보는 package.json에 고스란히 기록되어 있다. NPMv2는 각 모듈 폴더 기준 하위에 모듈이 설치 되고, NPMv3은 App 폴더 기준으로 해당 모듈이 있는지를 판단하여 없는 경우 모듈을 설치한다. 그로 인해 알아차릴 수 있는 변화가 있다.


NPMv2는 각 모듈 기준 설치가 되기 때문에 중복되는 모듈 코드의 양이 많은 편이며, 모듈에 모듈이 설치되는 깊이가 깊어질수록, 소스 형상관리에 문제점이 발생한다. 폴더의 깊이가 너무 심하게 들어가기 때문이다. NPMv3은 이런 부분을 개선하고자 App 폴더 기준으로 하위 모듈도 같이 관리 한다. 이미 설치가 되어있을 때에는 설치를 생략한다.



조건이 따르게 된다. 하위 모듈에 버전이 같은 경우에만 성립한다. 만약 그 점을 간과한다면, 모듈이 오작동 할 수도 있다. 해결을 위해서는 기존 NPMv2 방식도 병렬로 같이 사용한다.



App 폴더 기준 설치는 되어 있지만, 버전이 다른 경우에는 모듈 기준으로 설치된다. 이로써 버전에 대한 문제도 해결되고, 공통 하위 모듈은 일괄적으로 관리되기 때문에 전체적인 관리는 줄어들게 되고, 프로젝트의 효율도 올라가게 된다.


Node 버전 v4.x.x (LTS)는 NPMv2가 설치되어 있다. v5.x.x (stable)를 사용하지 않고 NPMv3을 사용하려면 npm install -g npm@3 명령어를 사용하자. npm -v 로 확인할 수 있을 것이다.


참고 사이트


tcpdump 옵션


# tcpdump -i eth0 -s 65535 tcp port 3000 -X


  • -i: network interface (ex: -i lo)
  • -s: packet length (ex: -s 65535)
  • port: (ex: tcp port 3000)
  • -X: hexcode


-s 옵션은 전체 packet를 봐야할 경우에만 65535로 정의


tcpdump 사용하기


# tcpdump -i lo -s 65535 tcp port 3000 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes

// ... packet

0 packets captured
0 packets received by filter
0 packets dropped by kernel


network interface (lo), -s 65535 (packet length) 전체 패킷을 보는경우 사용, tcp port 3000 (모니터링 포트), -X (hexcode) 로 출력, 자주 사용하는 옵션이다.



Node.js는 ES6을 지원하고 있다. 고질적인 자바스크립트의 문제점을 보완하는 문법이 제공된다.


무턱대고 사용하다가는 큰 코 다칠 수 있다. 버전 별로 지원되는 기능이 차이가 있기 때문이다. 아래 링크는 지원되는 ES6의 목록이다. Server/runtimes 부분을 참고하자.


http://kangax.github.io/compat-table/es6/



Node.js는 아래와 같은 기능을 기본으로 제공하고 있다.



전체적으로 사용하기에는 시기상조이고, 개인적으로 현재 사용할만한 기능은 자바스크립트에서 항상 문제가 되어왔던 Scope 를 좀더 엄격하게 제한을 두는 문법인 Block scoping, 그리고 Connections 정도라고 생각한다.


참고 사이트


Node.js 프로젝트가 마침표에 가까워질 수록 프로세스를 어떻게 관리해야 할지 고민한다. 요즘은 Node.js Domain API에 완전히 당해서 넋이 나가 있었다.


PM2 로 App 을 시작 할 때 Debug Log를 감시하고 싶을 때가 있다. 아이러니하게도 node debug로 사용된 로그는 stderr 로 출력된다.



stdout 으로 출력하기 위해서는 환경변수를 추가해야 한다.


DEBUG_FD=1


아래는 pm2 설정 JSON 이다. 취향에 따라서 직접 명령으로 실행해도 무관 하다.


  • pm2-test.json
{
    "apps": [
        {
            "name"             : "test-app",
            "script"           : "./test.js",
            "error_file"       : "./logs/app/test-app.stderr.log",
            "out_file"         : "./logs/app/test-app.stdout.log",
            "pid_file"         : "./pids/test-app.pid",
            "instances"        : 0,
            "min_uptime"       : "1000s",
            "max_restarts"     : 15,
            "watch"            : false,
            "ignore_watch"     : ["[\\/\\\\]\\./", "node_modules"],
            "merge_logs"       : true,
            "exec_interpreter" : "node",
            "exec_mode"        : "cluster_mode",
            "autorestart"      : false,
            "vizion"           : false,
            "env"              : {
                "NODE_ENV"     : "development",
                "DEBUG"        : "*",
                "DEBUG_FD"     : 1
            }
        }
    ]
}


명령어를 실행 시 node debug로 사용된 로그는 stdout 으로 출력된다.


pm2 start pm2-test.json



정상적으로 출력 되는 것을 확인 할 수 있다.


'Nodejs' 카테고리의 다른 글

NPMv3 사용하기  (0) 2016.04.04
Node.js와 ECMAScript 2015 (ES6)  (0) 2016.01.04
Node.js NPM Previous Version 설치 하기  (0) 2015.12.08
play.node(2015) 후기  (0) 2015.11.13
Nodejs Express 4.x File Upload 설정 하기  (0) 2015.02.10

Node.js release - https://nodejs.org/en/download/releases/


위 링크는 node.js release 내역이다. windows 환경에서 Node.js v4.x.x, v5.x.x를 번갈아 설치 하다 보면, npm 버전이 3.x.x으로 고정되는 현상이 발생한다. 처음에는 방법을 몰라서 몇 번이고 재설치를 해보았지만, 바보 같은 시도였다. 초심으로 돌아가서 생각해보니 npm 으로 재설치 하면 될까 하는 방법이 떠올랐다.


$ npm -v
3.3.10

$ npm install npm@2.14.7 -g

$ npm -v
2.14.7


npm install {app}@{version}


  • app: 설치 할 앱
  • version: 설치 할 버전

위와 같이 설치 하면, node.js 재 설치 없이, 원하는 버전을 설치 할수있다.




상기 내용에 대한 저작권은 play.node 에 있습니다.


play.node(2015) 후기입니다. 좋은 경험을 할 수 있게 기회를 주신 회사에 감사드립니다.

1. Node.js LTS/Stable





Node.js 는 초창기에 v1.0 이 과연 언제 나올까 기다리는 게 큰 이슈였습니다. 불미스럽게도 node.js 를 fork 로 시작한 io.js 가 나오게 되고 나뉘어 가는 행보를 보였으나, 결국 통합되어 v4.0.0 이 나오게 됩니다. 


기존에는 stable, unstable 정책으로 관리 되었으나, 이번에 새롭게 변경되었습니다.


LTS는 짝수 버전에 해당하며, 안정화, 호환성에 초점을 맞춘 버전이고, stable는 새로운 기능이 활발하게 개발되는 버전입니다.


위 그림은 해당 내용에 대한 버전 일정 이며, 기업에서는 미리 버전 업데이트 일정을 정해서 대비할 수 있습니다.


Node.js 소식은 http://nodejs.github.io/nodejs-ko/ 에서 번역본을 볼 수 있습니다. 번역 까지는 최소 2주 정도 걸린다고 합니다.


2. Node.js Module - (NodeSource/Tim Oxley)


Javascript로 작성되는 프레임워크는 수명이 짧다고 합니다. 해당 언어로 구성된 Node.js 생태계는 격동하는 모습을 보여주고 있고, 프레임워크에 의존하게 되면 새로운 버전이 나왔을 때 맞추어 갈 수 없는 상황이 나오기도 합니다. 예를 들어 C/C++ 로 작성된 모듈이 버전 업데이트를 했을 때 동작하지 않는 경우도 있었다고 합니다. 프레임워크를 도입한다면, 고질적인 문제를 항상 고려해야 합니다.




Node.js 는 프레임워크 보다 상대적으로 모듈화 문화를 적극적으로 지지하고 있고, Node Package Manager(NPM)의 total packages는 공식 홈페이지 2015/11/13 기준 204,841 개입니다.



각 언어의 설치 패키지 pip, gem, maven 등을 합친 수보다 많다고 합니다. 수가 많은 만큼 사용되지 않는 라이브러리도 많으므로, 선점 할때, commit 날짜, 다운로드 수, 버전에 대한 정보는 확인합니다.


실제 애플리케이션을 개발할 때는 라이브러리 개발과 다소 차이가 있다고 합니다. 라이브러리는 단순하면서 사용하기 편해야 합니다. 애플리케이션은 고객의 비지니스를 만족해야 합니다. 개발할 때 자신도 모르게 복잡성 안에 함몰된 있는 모습을 발견합니다. 발표자는 Over Engineering 이라고 표현합니다. 무리한 요구사항이 들어와서 이를 적용해야 하는 데, flat 한 구조, 설계가 된 구조 애플리케이션이 있다고 가정하면, 후자가 훨씬 비용이 많이 들어가게 됩니다. 무리한 설계는 안 하는 좋습니다.


Javascript는 문제가 발생했을 때 해결을 쉽고 빠르게 할 수 있다는 장점이 있습니다. 하지만 끝나지 않는 숙제가 있습니다. 중첩 Callback, 비동기 코드이기 때문에 결과 예측이 쉽지 않습니다. 발표자는 수직적인 구조 사용을 자제하고, flat 한 구조를 권장하고 있습니다.


모듈화를 할수록 Local 복잡도는 감소하는 대신 Global 복잡도는 증가합니다. 최대한 단순하게 개발하고 지나친 모듈화는 피해야 합니다.


3. Node Package Manager [NPM V2 -> NPM V3] - (npm inc/Kat Marchan)




Package Magager 의 Node.js 버전입니다. 흔히 많이 알고 있는 pip, gem, maven과 비슷합니다. 앞에 Node를 붙여 약자로 NPM 이 됩니다.


불편한 점, 버그는 github, twitter 로 개발자들이 문의합니다. NPM V2 중 제일 많았던 문의는 dependence tree입니다. “npm install package” 명령어로 설치를 진행합니다. 각 패키지별 dependence 도 존재 하는 데, 각각 관리를 하므로 중복되는 package가 많고, 규모가 작은 애플리케이션이면 무시할 수 있는 수준이지만, 규모가 커진 경우 애플리케이션 용량이 큽니다. NPM V3 에서는 기능 개선을 하여 각 패키지 dependence 의 중복을 제거하여 기존에는 하위에 하위 폴더로 가는 구조였다면, 같은 선상에서 package가 설치됩니다. 중복을 제거하는 대신 안정화 된 버전의 패키지가 설치되어야 하므로 버전 규칙에 대해 강조 하였습니다.


설치 시 진행 상황을 알고 싶어하는 요청이 있어 NPM V3 에서는 설치 시 Progress Bar를 지원합니다.




npm 다운로드 유저중 42%는 윈도우 개발자이기 때문에 지원을 아까지 않는다고 합니다.


NPM V3 은 Node.js v5.0.0 이상부터 지원합니다.


4. Callback Hell


동기 방식은 차례로 진행되지만, 비동기 방식은 동시에 실행이 되기 때문에 끝났다는 신호를 줘야 합니다. 그 신호가 일명 Callback입니다.


비동기 방식을 동기 방식처럼 개발하기 위해 많은 노력이 있었습니다.


이를 극복하는 라이브러리에 대한 소개입니다.


async

  • 순차 혹은 병렬 실행 지원
  • 어지간한 경우에 쓸만 합니다.

promise

  • ES6 표준에 포함
  • async와 비슷하나 좀 더 깔끔한 코드
  • 병렬 실행이 가능합니다.
  • 예외 처리가 역시 쉽습니다.

출처



소개

인터넷 검색을 하면서 무심결에 사용하고 있는 기능이 있다. 바로 자동완성 기능이다. 검색어를 만드는 중 미리 연관 검색어를 가져와서 완성을 돕는다. 개발 단계에서 단골손님으로 등장하는 요구 사항이다.


해당 기능을 위한 라이브러리를 공유 한다.



위 그림은 유사한 라이브러리인 jQuery autocomplete 와 typeahead 의 관심도 통계 이다. 구글 트랜드를 사용하였다. 사용량은 증가하는 추세 이다.


2가지의 라이브러리로 구성 되어 있다.


  • bloodhound.js (standalone suggestion engine)
  • typeahead.jquery.js (standalone UI view)

검색을 담당하는 bloodhound.js 와, 이벤트 처리를 담당하는 typeahead.jquery.js 로 구성 되어 있다. 실제 라이브러리를 사용할 때에는 bundle 버전을 사용 한다. 두 가지 기능을 포함하고 있다.

브라우저 지원 여부

Chrome Firefox Safari Internet Explorer Opera
ALL 3.5+ 4+ 8+ 11+


라이브러리 사용에 앞서 지원 브라우저 확인은 필요 하다. 프로젝트 정책에 맞지 않는 브라우저가 있는 경우, 울며 겨자먹기로 개발하는 경우가 생길 수 있기 때문 이다.

특징

자동완성 시 시점마다 이벤트가 구현되어 있어, 개발이 편리 하다.


  • typeahead:open ( 검색 창 열림 )
  • typeahead:rendered ( 검색 결과 생성 )
  • typeahead:cursorchanged ( 위 아래 커서 이동 )
  • typeahead:selected ( 선택 )
  • typeahead:autocompleted ( 검색어 자동완성 Tab 키 )

사용 예제

See the Pen typeahead sample by min chul park (@whitelife) on CodePen.

참고 사이트


+ Recent posts