Development/node.js2017.04.06 05:36

node.js 를 사용하면서 가장 애를 먹는 것중 하나가 설치한 모듈을 찾지 못한다는 메세지를 만날때 입니다. 환경에 따라 모듈의 설치 경로가 달라질 수 있고, node.js 가 설치된 모듈을 찾아가는 순서에 영향을 받기 때문입니다. 간단한 몇 가지 명령을 통해 node.js 가 어떤 순서로 모듈을 탐색하는지 확인하고 글로벌 모듈로 설치된 경우 이를 명시적으로 node.js 가 이용할 수 있도록 알려줌으로써 어느정도 문제를 해결할 수 있습니다.


아래와 같이 npm 에서 -g 옵션을 이용하여 모듈을 설치하면 글로벌 모듈로 설치가 됩니다. 프로젝트에 관계 없이 설치된 모듈을 이용할 수 있어야 하는 것이지요. 일부 환경에서는 sudo 명령을 이용하여 관리자 권한으로 설치를 해야 할 수도 있습니다.


$ npm install -g [#모듈이름#]


또는


$ sudo npm install -g [#모듈이름#]


이렇게 -g 옵션을 이용하여 글로벌 모듈로 설치하는 경우, 그 경로는 어떻게 될까요? 아래와 같은 명령을 이용하여 글로벌 모듈로 설치하는 경우의 Path 를 확인할 수 있습니다.


$ npm root -g

/usr/local/lib/node_modules


간혹 글로벌 옵션을 이용하여 설치한 모듈을 찾을 수 없다고 나오는 문제를 겪고 있다면, 위의 명령으로 확인한 경로를 NODE_PATH 라는 환경 변수에 저장하여 node.js 가 글로벌 모듈을 찾을 때 참조할 수 있도록 명시적인 지정을 할 수 있습니다. 반복적으로 사용해야 하는 값이기 때문에 홈 디렉토리의 .bash_profile 파일에 포함하여 터미널 실행시 셋업되도록 하면 되겠습니다. 윈도 환경에서는 시스템 환경 변수에 넣어주면 됩니다.


~/.bash_profile 에 아래와 같이 환경 변수 추가


export NODE_PATH="/usr/local/lib/node_modules"


글로벌 모듈 이외에 현재 프로젝트에서 모듈을 찾아가는 탐색 순서를 확인하려면 아래와 같이 간단한 자바스크립트 구문을 node.js 를 이용하여 실행해보면 됩니다. 아래의 경로로 모듈을 찾아본 뒤, NODE_PATH 에 지정한 경로까지 탐색하여 현재 환경에서 모듈을 찾고 이용하게 됩니다. 


$ node -e "console.log(global.module.paths)"

[ '/Users/snoh/node_modules',

  '/Users/node_modules',

  '/node_modules' ]


- NoPD -



저작자 표시 비영리
신고
Posted by 노피디
Development2015.05.07 17:00

빌드 2015 컨퍼런스에서 발표된 비주얼 스튜디오 코드(Visual Studio Code)는 크로스 플랫폼을 지향하는 텍스트 중심의 개발도구입니다. 마이크로소프트가 적극적으로 다른 플랫폼에 대해서 공략을 시작했다는 평을 받으며 많은 사람들이 환호하고 있는 툴이기도 합니다. 맥에서 강력한 인텔리센스(Intellisense) 기능을 이용할 수 있어서 화제입니다만 맥에서 인텔리센스를 구동시키는게 생각보다 쉽지 않더군요 (저만 그런 것일수도...)


여기저기 찾아보고 시행착오를 겪은 끝에 인텔리센스를 활용할 수 있는 방법을 찾아냈고 (사실 원래 있었지만 저만 못찾아냈던...) 같은 시행착오를 겪는 분이 계실것 같아서 간단하게 설치 순서와 필요한 패키지들을 정리해 봤습니다. 비주얼 스튜디오 코드 공식 웹사이트에 잘 설명되어 있는 부분입니다만 영어의 압박으로 꼼꼼히 읽지 않으면 놓치기 쉬운 부분들이 많더군요. 잘 안되시는 분들은 아래의 순서를 따라해 보시기 바랍니다.


  1. "비주얼 스튜디오 코드" 맥 버전을 설치합니다
    • 설치라고 되어 있긴 합니다만 공식 사이트에서 배포하는 zip 파일을 받는게 전부입니다.
      • 비주얼 스튜디오 코드 다운로드 : https://code.visualstudio.com/
    • 압축을 풀면 나오는 비주얼 스튜디오 코드 실행파일을 어플리케이션 폴더로 끌어놓아 런치패드를 통해 실행 가능하게 만들면 좋겠죠
    • 혹시나 터미널을 자주 쓴다면 .bashrc 파일이나 .bash_profile 에 아래의 스크립트를 넣으면 편리합니다
      • code () {
            if [[ $# = 0 ]]
            then
                open -a "Visual Studio Code"
            else
                [[ $1 = /* ]] && F="$1" || F="$PWD/${1#./}"
                open -a "Visual Studio Code" --args "$F"
            fi
        }

  2. 인텔리센스를 위해 TypeScript Definition Manager 를 설치합니다
    • 비주얼 스튜디오 코드는 TypeScript 가 사용하는 *.d.ts 파일을 이용하여 인텔리센스를 제공합니다
    • 이미 만들어진 *.d.ts 파일을 이용하기 위하여 TypeScript Definition Manager 를 설치해야 합니다
      • TSD 설치 안내 페이지 : http://definitelytyped.org/tsd/
      • TSD 설치를 하기 위해서는 node 가 먼저 설치되어 있어야 합니다 (npm을 이용...)
      • $ npm install tsd -g


  3. TSD를 이용하여 필요한 언어/모듈/패키지를 검색하여 설치합니다
    • TSD 의 Query 명령어를 이용하여 필요한 패키지를 조회합니다 (node.js 에 대한 조회)
      • $ tsd query node
        >> tsd 0.5.7
        VersionMatcher.filter; gt; 0.11.0; 0.10.0
         - node/node.d.ts : <head> : 2015-05-07 05:06
        
    • 조회한 패키지의 이름을 이용하여 설치 명령을 내립니다 (--action install 을 추가)
      • $ tsd query node --action install >> tsd 0.5.7 VersionMatcher.filter; gt; 0.11.0; 0.10.0 - node/node.d.ts : <head> : 2015-05-07 05:06 >> running install.. >> written 1 file: - node/node.d.ts


  4. 설치가 잘 되었는지 확인해 봅니다
    • 사용자 루트 경로에서 "typing" 이라는 폴더가 생성되었는지 확인합니다
    • 해당 폴더 안에 "node" 라는 폴더가 있는지 보고, 그 안에 "node.d.ts" 파일이 존재하는지 확인합니다
    • Node Express Generator (참고 : https://code.visualstudio.com/Docs/nodejs) 로 만든 스캐폴딩 프로젝트의 app.js 를 엽니다
    • 14 라인의 __dirname 이라는 node 시스템 변수가 인식되지 않고 있습니다만... "커맨드+점(.)"을 눌러 Reference 를 추가해 줍니다
    • 코드 상단에 Reference 태그가 추가됩니다
    • 이후 테스를 위해 http 모듈을 추가하고 인텔리센스가 동작하는지 봅니다. 잘 되는군요.

좀 돌아왔습니다만 이제 TSD 파일만 잘 설치하면 왠만한 코드는 정말 간편하게 만들 수 있을 것 같습니다. 비주얼 스튜디오 코드로 맥에서도 훌륭한 인텔리센스와 가벼운 에디터를 사용해 보시기 바랍니다!





저작자 표시 비영리
신고
Posted by 노피디
Development/node.js2013.07.16 09:06
Node.js 가 등장한 이후 간단히 테스트 목적의 웹 서버를 만드는 일이 손쉬워졌습니다. 단순한 Static 컨텐츠의 노출이 아닌 이상 닷넷을 이용하던 자바를 이용하던 뭔가 무거운 개발도구를 실행하고 코드 몇 줄을 넣은 후 컴파일 해야 했다면 Node.js 는 그런 번거로움과 불필요함을 한방에 날려주고 있습니다.

새롭게 옮긴 직장에서 고객사의 PUT Request 에 대한 처리를 해야 할 일이 생겼는데 고객사의 API 에 대고 신나게 테스트를 할 수 있는 것도 아니고 해서 간단하게 가상머신에 Node.js 와 Express 모듈을 이용하여 RESTful API (..라고 적었지만 그냥 PUT Request 를 처리하는...) 를 만들어 봤습니다. 혹시나 RESTful API 의 CRUD 액션을 간단히 구현할 필요가 있으신 분들 참고하시라고 올려둡니다. Node.js 와 Express 모듈을 설치하신 뒤 소스코드를 참고해서 보시면 됩니다. REST 호출 이외에도 처리를 위해 Jade 모듈도 설치후 설정이 들어가 있는데요, 이 부분은 필요하신 경우 선택적으로 쓰시면 되겠습니다.

(참고로 현재 시점에서의 Node.js 와 Express 최신 버전을 따르고 있기 때문에 보시는 시점에 따라 해당 엔진과 모듈의 행동양태가 변경되면 동작하지 않을 수도 있습니다 ^^;;)

// express_server.js
var express = require('express');
var app = express();

app.configure(function() {
	app.set('views', __dirname + '/views');
	app.set('view options', { layout: false });
	app.use(express.methodOverride());
	app.use(express.bodyParser());
	app.use(app.router);
	app.use(express.static(__dirname + '/public'));
	console.log('configure successful...');
	console.log('view directory is ' + __dirname + '/views');
	console.log('static directory is ' + __dirname + '/public');
});

app.get('/hello', function(req, res) {
	res.render('index.jade', {
			message:'hello world'
	});
});

// TYPE 1 (RESTful) : call "/puttest/3"
app.put('/puttest/:id', function(req, res) {
	res.send('received id :' + req.params.id);
});

// TYPE 2 (Traditional) : call "/puttest" with body parameter "id=9" then
app.put('/puttest', function(req, res) {
	res.send('received id :' + req.body.id);
});

app.configure('production', function() {
	app.use(express.logger());
	app.use(express.errorHandler());
});

app.configure('development', function() {
	app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.listen(81);

위의 소스코드에서 사용한 Jade 템플릿은 아래와 같이 간단하게 되어 있습니다. 그냥 그렇구나 하시면 될 것 같습니다.
// Jade 렌더링 테스트용 : /views/index.jade
#{message}

[ Node.js 의 기초를 위한 추천 도서 ]
인기 저자 윤인성 작가의  "모던 웹을 위한 Node.js 프로그래밍" [자세히보기]


- NoPD -
저작자 표시
신고
Posted by 노피디
Development/node.js2012.11.08 18:08
Node.js 를 공부하고 코드를 테스트 하는 방법은 여러가지가 있습니다. Cloud9 과 같은 웹 기반의 IDE 를 이용하는 방법이 가장 간편하고 사용자 환경도 타지 않기 때문에 좋지만 웹 기반이다 보니 은근히 불편한 점들이 있는 것도 사실입니다. 이 때 우리가 선택할 수 있는 좋은 대안은 Node.js 를 PaaS 형태로 제공하는 호스팅 서비스를 이용하는 것입니다. 그중에서도 오늘은 Node.js 를 비롯하여 Ruby, Java, Python 등을 PaaS 형태로 제공하는 Heroku 를 이용하기 위한 준비를 해보겠습니다. (간만에 글 올리면서 마치 준비된냥 Heroku 를 건드립니다 ;;;)

먼저 Heroku 를 사용하기 위해서는 간단한 가입 절차를 거쳐야 합니다. 이런 류의 외국 서비스들이 그러하듯 간단한 이메일 인증만을 하면 무료로 사용할 수 있는 공간을 할당받게 됩니다. Heroku 는 기본적으로 무료 서비스이고 추가적으로 용량을 늘리거나 다른 서비스를 이용할 때 추가적으로 비용을 내면 됩니다. 참고로 Cafe24 가 제공하고 있는 Node.js 호스팅 서비스의 최소 단위는 월 500원 입니다 ;;;


invalid-file

undefined


 Heroku 에 가입하기 위해서 가입 페이지로 이동합니다. (바로가기 : https://api.heroku.com/signup) 간단한 이메일 입력만으로 가입은 끝납니다. 참 쉽죠잉? 이메일을 입력하고 Sign Up 버튼을 누르면 입력한 이메일로 컨펌 URL 이 발송됩니다. 이메일도 빨리 도착하기 때문에 수신함에서 메일을 찾아 본문의 컨펌 URL 을 클릭하면 됩니다.


이메일에 대한 유효성 점검이 끝났다고 모두 끝은 아니겠지요? 비밀번호 정도는 셋팅 해줘야 나중에 로그인을 할 수 있을 겁니다. 설마 정말로 이메일만 입력했다고 모든게 끝이라고 생각했다면 여러분은 바보 입니다 -_-;; (퍽퍽...) 실제로 개발을 하고 소스 버전 관리를 하고 커밋 하는 등의 행위를 위해서 커맨드 라인 도구를 제공하는데 이 때도 필요한게 바로 이 비밀번호이니 잘 기억해 두시기 바랍니다.

 
비밀번호까지 입력하고나면 간단한 Get Started 방법에 대한 가이드가 화면에 출력됩니다. 로컬에서 개발하고 Heroku 로 소스코드를 업데이트 하고 구동시키기 위해서 몇 가지 도구가 필요한데요, Git 과 SSH 도구를 잘 엮어둔 Heroku Toolbelt 라는 패키지를 제공하고 있습니다. 사용자 환경이 윈도우냐 맥이냐, 아니면 리눅스냐에 따라 패키지가 여러가지로 제공되니 각자 필요한 패키지를 다운로드 받아 설치하면 되겠습니다. Heroku Client 와 Git, SSH 등이 설치된다는 것 기억하시구요.

 
잠시동안 지루한 설치 작업이 진행되고나면 끝납니다. 그리고 아무것도 보이지 않습니다. 뭘 해야 할까요? 윈도우 기준으로 설명을 드리면 설치가 끝나고 나면 윈도우 커맨드라인 도구 (시작 > cmd) 를 실행해서 Heroku 라는 커맨드를 통해 명령행 도구를 실행하셔야 합니다. 그냥 Heroku 라고 한번 쳐보시고... " 아 그렇구나 " 하신다음 위의 스샷처럼 heroku login 명령을 내려주시기 바랍니다. heroku login 명령을 입력하면 조금전에 가입시 썼던 이메일과 비밀번호를 입력합니다.


Git 에 엑세스 하기 위해서는 SSH Key 를 만들어야 합니다. 로컬에서 접근하기 위해서도 필요하고 Heroku 가 Git 에 접근하기 위한 권한 부여를 위해서도 필요합니다. heroku login 을 처음 하게 되면 이런 과정을 한큐에 다 정리를 해줍니다. SSH Key 를 생성해서 로컬에 저장해 주고 (윈도우의 경우 기본 사용자 프로파일 경로에 /.ssh/ 폴더 밑에 생성) Heroku 에 업로드까지 깔끔하게 마무리 해줍니다. Key 가 잘 등록되었는지 확인하기 위해서는 heroku keys 라고 입력해 보면 됩니다. 키를 지우려면 heroku remove 하면 되고 키 추가를 위해서는 heroku keys:add 하시면 됩니다.

자 여기까지가 Heroku 사용을 위한 환경 셋팅입니다. Heroku Toolbelt 가 제공되기 전까지는 별도로 Git 도구를 설치하고 키 생성을 하는 등 번거로운 작업이 많았지만 이제는 참 많이 편해졌다고 다들 그러시더군요 -_-... 그럼 샘플 코드 올려서 구동해보는 건 다음시간에... 해보시지요.

- NoPD -

 
저작자 표시
신고
Posted by 노피디
Development/node.js2012.05.23 08:30
새로운 언어나 개발환경에 익숙해 지는데에는 간단한 실습만한 것이 없다. Hello World 를 출력하는 프로그램이 모든 언어의 첫번째 예제가 되는 것은 다 이유가 있다. Hello World 를 출력하는 프로그램을 통해 언어가 가지고 있는 기본적인 코드 구성 방법을 이해할 수 있고 표준 입출력을 이용하여 결과값을 출력해 볼 수 있기 때문이다. 

node.js 역시 마찬가지 방법으로 접근을 해보고자 한다. 다만 javascript 에 익숙치 않은 사람들을 위하여 점진적으로 코드를 완성해 나가는 방식을 이용해 앞으로 설명을 하고자 한다. NoPD 역시 OOP 기반의 언어들에 익숙한 상태라 처음 javascript 에 익숙해 지는데 시간이 무척 오래 걸렸다. javascript 가 궁극의 개발 언어라고 주장하는 사람들은 이런 javascript 의 코드 개발 방식을 들기도 하니 유심히 살펴볼 필요도 있을 것 같다


자바스크립트로 서버를 만든다고?

node.js 는 서버 혹은 클라이언트에서 사용될 수 있는 스크립트임을 앞선 포스팅에서 이야기 했다. 클라이언트야 그렇다 치고 서버에서는 도대체 무슨 역할을 할 수 있는 것일까? node.js 는 로직을 가지고 있는 javascript 로서의 역할도 충분히 하겠지만 그 보다는 웹 서버, 소켓 서버 등의 역할로 사용되는 경우가 더 많다. 서버에 설치된 웹 서버 (예> IIS, Apache) 의 유무와 상관없이 독립적으로 동작이 가능하다.

웹 서버라는 것이 결국은 특정한 포트 (예> 80) 를 통해 TCP 통신을 받아들일 수 있도록 해주는 역할이라고 해석한다면 소켓 서버를 특정한 포트로 만드는 것과 별반 다른 것이 아니라는 점을 이해할 수 있을 것이다. 이제 간단한 웹 서버를 만드는 코드를 통해 node.js 의 구조를 이해하고 얼마나 생산성 높은 개발 환경인지를 알아보도록 하자.

var http = require('http');

먼저 위와 같이 코드를 입력해 보자. var 는 자바스크립트에서 변수를 선언할 때 사용되는 키워드이다. http 라는 변수를 선언하고 이 변수에는 require('http') 라는 문장을 통해 node.js 의 http 모듈의 객체 인스턴스를 생성하도록 했다. node.js 은 다양한 모듈을 가지고 있는데 모듈을 사용하기 위해서는 위와 같은 코드를 이용한다. 다른 언어에서 include 나 using, import 와 같은 역할을 한다고 보면 된다.

코드의 구조를 잡아보기

객체 인스턴스를 생성했으면 이제 이 인스턴스가 제공하는 다양한 메소드를 이용하기만 하면 된다. node.js 의 서버 모듈이 제공하는 다양한 메서드와 이벤트는 공식 웹사이트의 도움말을 참고하면 좋다 (바로가기 :  http://nodejs.org/api/http.html) 우리는 일단 간단한 웹 서버를 만들어 볼 예정이니 문서가 제공하는 방대한 내용을 다 이해할 필요는 없다. 이제 코드에 살을 좀 붙여보자.

var http = require('http');

http.createServer(function (request, response) {

});

생성한 http 인스턴스가 제공하는 createServer 메소드를 호출하는 코드이다. createServer 메소드는 파라메터로 requestListener 를 받는다고 공식 문서에 정의되어 있다. requestListener 는 특별한 것은 아니고 공식 문서에도 기술되어 있는 것처럼 request 이벤트의 이벤트 핸들러 형태를 따르는 함수면 된다. 그런데 이 서버는 어떤 포트를 통해 요청을 받을 것인지가 명시 되어 있지 않다. http 객체가 제공하는 listen 메소드를 이용해 1234번 포트로 요청을 받는 서버를 만들어 보도록 하자.

var http = require('http');

http.createServer(function (request, response) { 

}).listen(1234);

참 간단하다. 이제 이 코드에 우리가 추가해야 할 것은 요청(request) 가 들어 왔을 때 무엇을 회신(response) 할 것이냐이다. 웹 서버라는 것이 별 것은 아니고 사용자의 요청이 들어왔을 때 적절한 회신을 해주는 것임을 생각해 보면 이해하기는 어렵지 않다. 회신할 내용을 만드는 코드를 넣고 서버가 동작중임을 알리는 콘솔 메세지를 추가해보자.

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World~!\n');
}).listen(1234);

console.log('Server running at http://127.0.0.1:1234/');
결과 확인해 보기! 

어렵지 않게 웹 서버를 무사히 만들어 냈다. 물론 진짜 웹 서버에 비하자면 동적인 웹 페이지의 생성, 적절한 결과의 응답등이 빠져 있지만 이런 부분들은 앞으로 여러 포스팅을 통해 다양한 모듈을 활용하여 풀어나갈 수 있는 부분이니 여기선 구조를 이해하는 선이면 충분할 것 같다. 이제 node.js 에서 만든 코드를 실행해 보도록 하자.  

 
서버가 동작중임을 알려주는 메세지가 화면에 출력되어 있다. 기본적으로 createServer 는 별도로 종료하지 않는한 계속 구동되고 있게 된다. 서버를 종료하는 별도 로직을 추가하거나 (특정한 요청에 응답?) Ctrl-C 등을 눌러 프로세스를 종료 시키면 서버는 종료되게 된다. 물론 서버가 종료되면 안되는게... 기본 동작 요구사항일 것이므로 그냥 그렇다고만 알고 있자. 이제 웹 브라우저를 이용하여 웹 서버에 접근을 해보도록 하자.


놀랍지 않은가? 단 몇줄의 코드로 웹 서버를 구동시켜 보았다. 앞서 이야기 한 것처럼 보완할 부분이 많은 말 그대로 껍데기 밖에 없는 웹 서버이지만 node.js 의 원리를 이해하고 강력한 기능을 맛보기에는 충분한 예제였다. 앞으로 node.js 를 이용하여 재미있는 것들을 많이 만들어 나가도록 하자.


- NoPD -

 
저작자 표시
신고
Posted by 노피디

티스토리 툴바