[번역] Accessing the File System in Node.js, #Haroopress


하루프레스에 작성한 것중 빼먹어서 다시...


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu

 원문 sitepoint.com의 Accessing the File System in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~~ :-)

Accessing the File System in Node.js

지난 수년동안 JavaScript는 파일 시스템에 대한 접근이 아주 제한적이었다. 물론 JavaScript는 그동안 대부분이 브라우저에서만 동작을 했다. 웹 스크립팅 언어로 파일 시스템에 접근하는 것은 보안에 대한 큰 위험요소라고 간주되었다. 프론트 엔드 개발자들은 쿠키, 웹스토리지엑티브엑스나 기타 다른 기술들을 사용할 수 밖에 없었다. HTML5가 파일 시스템 API에 대해 다루었지만 크롬 이외에는 대부분 여전히 지원되지 않는다. Node.js의 출현으로 JavaScript는 적합한 서버측 언어로써 발판을 확보하기 시작했다. 서버에서의 파일 시스템 접근은 일반적인 일로 API에 대해서 훨씬 덜 고민하게 한다.

The File System Module

기본적으로 Node.js 설치 시 파일 시스템 모듈인 fs도 같이 설치된다. fs 모듈은 대부분 단순하게 표준 파일 작업에 대한 래퍼를 제공한다. 다음의 예제에서는 파일의 내용을 메모리로 읽기 위해 파일 시스템 모듈을 사용한다. 우선 1 라인에서 파일 시스템 모듈을 임포트 하고 3 라인에서는 exist() 함수가 “foo.txt” 파일의 존재 여부를 확인한다. exists()의 콜백 함수는 파일의 존재 여부를 명시한 불리언 값을 인자로 받는다. 그 다음의 stat() 함수는 파일의 길이를 바이트 단위로 확인하기 위해 사용된다. 이 정보가 중요한데 그 이유는 그것으로 인해 우리가 읽어야 할 데이터양을 알수 있기 때문이다.

다음으로 open()을 사용해서 파일을 여는데 여기에서 r 인자는 파일이 읽기 전용으로 열린다는 것을 의미한다. open()의 콜백 함수는 새로 연 파일을 접근하기 위한 파일 디스크립터인 fd를 제공한다. 콜백 함수 안에서 우리는 파일의 내용을 담아둘 버퍼를 정의한다. 버퍼의 크기가 stats.size에 저장되어 있는 파일의 크기로 초기화 됐다는 것을 주목해라. 그 다음, 파일은 read() 함수를 사용해서 버퍼로 읽어 들인다. 버퍼는 이제 파일로부터 읽어들인 로우 데이터를 포함하고 있다. 데이터를 표시하기 위해서는 먼저 UTF-8로 인코딩된 스트링으로 변환을 해야 한다. 마지막으로 파일 내용을 콘솔에 출력하고 파일을 닫는다.

var fs = require("fs");
var fileName = "foo.txt";
fs.exists(fileName, function(exists) {
  if (exists) {
    fs.stat(fileName, function(error, stats) {
      fs.open(fileName, "r", function(error, fd) {
        var buffer = new Buffer(stats.size);
        fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
          var data = buffer.toString("utf8", 0, buffer.length);
          console.log(data);
          fs.close(fd);
        });
      });
    });
  }
});

Synchronous Functions

문서들을 살펴볼 때 많은 함수들의 이름 끝이 Sync로 되어 있는 것을 주의해야 한다. 이것들은 동기화 함수를 나타낸다(Node.js의 콜백 기반에서는 다소 드문...). 동기화 함수는 편의성을 위해 제공한다. 예를 들어, Node.js로 작성된 간단한 배치 스크립트는 성능 최적화에 대해 고민할 필요는 없다. 또한, 동기화 함수는 프로그램이 초기화되는 동안 특정 파일들을 로딩하는 데 유용하다. 하지만, 실제 운영중인 서버 애플리케이션에서의 동기화 함수는 Node의 싱글 스레드 실행으로 인한 지연에 의해 심각한 성능 저하의 가능성이 있다.

다음 예제들은 동기적 또는 비동기적으로 어떻게 파일을 메모리로 읽는지를 보여준다. 위의 파일을 읽는 예제는 솔직히 조금 복잡하다. 이번의 예제는 한번의 함수 호출로 전체 파일을 읽는 readFile() 함수를 사용한다. readFile()의 처음 두 인자는 파일 이름과 파일의 인코딩이다. Node.js 관례에 따라 마지막 인자는 콜백 함수이다. 콜백 함수의 인자로는 error 정보와 파일의 내용을 제공한다.

var fs = require("fs");
fs.readFile("foo.txt", "utf8", function(error, data) {
  console.log(data);
});

다음 예제는 readFileSync()를 사용해서 위와 동일한 작업을 동기적으로 수행한다. 동기화 코드는 조금 더 가독성이 있지만, 비동기화 코드와 같은 확장성을 제공하지 못한다.

var fs = require("fs");
var data = fs.readFileSync("foo.txt", "utf8");
console.log(data);

Watching Files

파일 시스템 모듈은 프로그램이 특정 파일들의 변경사항을 관찰할 수 있게 한다. 이것은 소스 코드가 수정되면 프로그램을 자동으로 재시작 시켜주는 nodemon과 같은 프로그램에게는 매우 유용하다. 다음 예제는 “foo.txt”라는 파일을 관찰한다. 파일이 수정되면 콘솔에 이벤트에 대한 정보를 출력한다.

var fs = require("fs");
var fileName = "foo.txt";
fs.watch(fileName, {
  persistent: true
}, function(event, filename) {
  console.log(event + " event occurred on " + filename);
});

watch() 함수는 세개의 인자를 받는다. 첫번째 인자는 관찰하기 위한 파일의 이름이다. 두번째 인자는 선택사항으로 구성 설정을 제공하는데, 위 예제에서는 persistent라는 이름의 불리언 값을 포함하는 객체이어야 한다. persistent 값이 true이면 프로그램이 종료되지 않는다. 만약 두번째 인자가 생략된다면 기본으로 true로 설정된다. 마지막 인자는 목표가 되는 파일이 수정될 때 트리거되는 콜백 함수이다. 콜백에는 이벤트 유형(change, rename 등)과 파일의 이름을 전달한다. watch()가 기본 OS에 의존적이어서 모든 시스템에서 작동하지는 않을 수 있다는 것을 알고 있어야 한다. watch()를 사용할 수 없다면 대신에 속도가 느린 watchFile()을 사용할 수는 있다.

Conclusion

이 글은 파일 시스템 모듈에 대해 매우 높은 수준에서 소개했다. 그 모듈은 하나의 글에서 소개하기에는 너무 많은 약 50개가 넘는 함수를 포함하고 있다. 예를 들어 이글에서는 파일을 읽는 부분만을 다룰 뿐, 파일을 쓰는 부분에 대해서는 완전히 배제하였다. 더 깊이 이해하기 위해서는 모듈에 관한 문서를 찾아보기 바란다. 그리고, 동기화 함수는 아주아주 조심히 사용해야 한다는 것을 기억해라!

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js

윈도우에서 하루프레스를... #Haroopress

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
프로그래밍/기타2013.05.05 20:01


21세기형 장난감, 라즈베리 파이... #Haroopress

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi


[번역] Web Scraping in Node.js, #Haroopress


 sitepoint의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js
  6. [번역] Making HTTP Requests in Node.js
  7. [번역] Getting to Know Node

 원문 sitepoint.com의 Web Scraping in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Web Scraping in Node.js

웹 스크랩퍼는 프로그래밍된 계획에 따라 웹페이지에 방문하여 데이터를 추출하는 소프트웨어의 일부이다. 웹 스크래핑은 콘텐츠 복제라는 이슈때문에 논란이 많은 주제중 하나이다. 대신에 대부분의 웹사이트 소유자들은 공개된 API를 통해 자신의 데이터에 접근하는 방법을 선호한다. 불행하게도 많은 사이트들은 부실한 API를 제공하거나 그마저도 제공하지 않는다. 이것이 많은 개발자들을 웹 스크래핑에 의지하게 만들었다. 이번 글에서는 Node.js로 여러분들 자신만의 웹 스크래퍼를 구현하는 방법에 대해 알려줄 것이다.

웹 스크래핑의 첫번째 단계는 리모트 서버로부터 소스코드를 다운로드하는 것이다. request 모듈을 사용하여 페이지를 다운로드하는 방법은 “Making HTTP Requests in Node.js”에서 배웠었다. 다음 예제는 Node.js에서 GET 요청 시 빠르게 리프레쉬하게 한다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
}, function(error, response, body) {
  console.log(body);
});

웹 스크래핑의 두번째 단계는 다소 어려운데 그것은 다운로드한 소스코드에서 데이터를 추출하는 것이다. 클라이언트 측에서는 선택자 APIjQuery같은 라이브러리를 사용하면 별것 아닌 일지만, 아쉽게도 이러한 해결책은 DOM에 쿼리가 가능하다는 사실을 전제로 하고 있다. 안타깝지만 Node.js는 DOM을 제공하지 않는다. 혹시 제공을 하는지?

The Cheerio Module

Node.js가 DOM에 대한 모듈을 내장하고 있지는 않지만, HTML 소스코드의 문자열로부터 DOM을 만들수 있는 여러 모듈이 있다. 그 중 많이 사용하는 두개의 DOM 모듈이 있는데 cheerio와 jsdom이다. 이번 글에서는 cheerio에 중점을 둘 것이며 다음 명령으로 모듈을 설치할 수 있다.

npm install cheerio

cheerio 모듈은 jQuery의 서브셋(하위집합)을 구현한다. 이것은 많은 개발자들이 빠르게 익힐수 있다는 것을 의미한다. 사실 cheerio는 jQuery랑 비슷해서 cheerio에 구현되어 있지 않은 jQuery 함수를 사용하려고 하는 자신을 쉽게 볼 수 있다.

다음 예제는 cheerio를 사용해서 HTML 문자열을 파싱하는 법을 보여준다. 첫번째 라인에서 cheerio 모듈을 프로그램에 임포트한다.html 변수는 파싱해야할 HTML의 일부분을 가지고 있다. 3 라인에서 그 HTML은 cheerio 모듈을 사용해서 파싱된다. 그 결과를 $ 변수에 할당한다. 달러 표시는 jQuery에서 전통적으로 사용되기 때문에 선택했다. 4 라인에서 CSS 스타일의 선택자를 사용해서 <ul> 요소를 선택한다. 마지막으로 html() 메소드를 사용해서 list의 내부 HTML을 출력했다.

var cheerio = require("cheerio");
var html = "<ul><li>foo</li><li>bar</li></ul>";
var $ = cheerio.load(html);
var list = $("ul");
console.log(list.html());

Limitations

cheerio는 활발히 개발중에 있고 항상 더 나아지고 있다. 하지만, 여전히 많은 제한사항을 가지고 있다. cheerio의 가장 불만스러운 점은 HTML 파서이다. HTML 파싱은 어려운 문제이고 잘못된 HTML을 포함한 많은 페이지가 있다. cheerio 모듈이 이러한 페이지들에서 충돌이 발생하지는 않더라도 여러분은 요소를 선택할 수 없게 될지도 모른다. 이것은 버그가 선택자에서 발생하는 것인지 아니면 페이지 자체에서 발생하는 것인지 결정하기 어렵게 만들수 있다.

Scraping sitepoint

다음은 완벽한 웹 스크랩퍼를 만들기 위해 request와 cheerio 모듈을 결합한 예제이다. 예제의 스크랩퍼는 sitepoint 홈페이지에 있는 모든 글들의 제목과 URL을 추출한다. 처음 두개의 라인에서 필요한 모듈을 임포트한다. 3 라인부터 5 라인까지 sitepoint 홈페이지의 소스코드를 다운로드한다. 그리고 나서 파싱을 하기 위해 소스를 cheerio 모듈에 전달했다.

var request = require("request");
var cheerio = require("cheerio");
request({
  uri: "http://www.sitepoint.com",
}, function(error, response, body) {
  var $ = cheerio.load(body);
  $(".entry-title > a").each(function() {
    var link = $(this);
    var text = link.text();
    var href = link.attr("href");
    console.log(text + " -> " + href);
  });
});

sitepoint의 소스코드를 보면 모든 글의 제목이 entry-title라는 클래스를 가진 <h1> 요소에 포함된 링크라는 것을 주의해야 할 것이다. 7 라인의 선택자는 모든 글의 링크를 선택한다. 그 다음 each() 함수는 모든 글들을 대상으로 반복하기 위해 사용된다. 마지막으로, 글 제목과 URL은 각각 링크의 텍스트와 href 속성으로부터 얻는다.

Conclusion

이번 글은 Node.js로 간단한 웹 스크래핑 프로그램을 만드는 법을 보여줬다. 이런 방법이 웹 페이지를 스크래핑하는 유일한 방법은 아니다. headless 브라우저(역자주-Graphical User Interface가 없는 웹브라우저)를 사용하는 것과 같은 다른 기술들도 있다. 더 강력하지만, 단순함 및(또는) 속도와 타협을 하게 될지 모른다. 다음 글은 headless 브라우저 모듈 PhantomJS에 대해 중점을 두어 다룰 것이다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] Getting to Know Node, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js
  6. [번역] Making HTTP Requests in Node.js

 원문 sitepoint.com의 Getting to Know Node

 이번 글은 내용이 인포그래픽으로 되어 있어 이미지에 마우스 오버시 번역을 보여주고 있다.

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Getting to Know Node

사람들은 흔히 하나의 그림이 수천 단어의 가치가 있다고 이야기 한다. 그래서 우리는 여러분을 위해 약 만개 정도 단어의 가치가 있는 그림을 준비했다. 이 글은 Node.js의 개요에 대해서 인포그래픽 스타일로 보여준다. 이 인포그래픽은 Node가 무엇인지 설명하고 서버측 JavaScript 프레임워크가 정확하게 얼마나 인기가 있는지를 보여준다. 만약 여러분이 아직 Node에 열광하지 않고 있다면 거부할 수 없는 이유를 알려줄 것이다.

 

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] Making HTTP Requests in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js

 원문 sitepoint.com의 Making HTTP Requests in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Making HTTP Requests in Node.js

이전의 글에서 Node.js 서버를 만드는 것에 초점을 둔것은 HTTP 요청을 처리하기 위해서였다. 이번 글은 문제를 반대로 생각해서 당신의 Node.js 애플리케이션이 HTTP 요청을 어떻게 만들어 내는지를 보여줄 것이다. 아마 왜 그렇게 해야 하는지 의문이 들지도 모른다. 문득 떠오르는 애플리케이션이 두개 있다 - web scraping과 proxying. 스크래퍼는 웹페이지를 다운로드하고 계획에 따라 그것으로부터 정보를 추출하는 소프트웨어이다. 프록시 서버는 다른 서버에게 클라이언트의 요청을 전달하고 응답을 반환해주는 중개인과 같은 역할을 한다.

The Request Module

Node.js에서 HTTP 요청을 만드는 가장 간단한 방법은 request 모듈을 사용하는 것이다. Mikeal Rogers가 만든 request 모듈은 GET,POSTPUT, 그리고 DELETE를 포함한 모든 유형의 HTTP 요청을 만들게 해준다. 그러한 유연성이 request 모듈을 RESTful APIs로 상호작용하기에 적합하게 만든다. 다음의 npm 명령을 사용해서 request 모듈을 설치할 수 있다.

$ npm install request

request가 설치되었다면 아래 보이는 코드로 새로운 Node.js 파일을 만들어보자. 예제의 첫번째 라인에서 request 모듈을 프로그램 안으로 임포트하였다. HTTP 요청을 만드는 것은 간단하게 request() 함수를 호출하면 된다. 이 예제에서 우리는 sitepoint 홈페이지를 다운로드하기 위해 요청을 하고 있다. 물론, request()의 두번째 인자는 콜백 함수이다.

var request = require("request");
request("http://www.sitepoint.com", function(error, response, body) {
  console.log(body);
});

request()의 콜백 함수는 세개의 인자를 받는다 - errorresponse, 그리고 body. 이름을 보면 알수 있듯이 error는 HTTP 요청 중 발생하는 모든 문제에 관한 정보를 포함하고 있다. response 인자는 호출에 대해 반환되는 상태코드, 헤더 등 많은 것들을 포함한 다양한 데이터를 가지고 있는 객체이다. 세번째 인자인 body는 응답의 body이다. 앞의 예제에서 body는 sitepoint 홈페이지의 소스 코드를 포함하고 있다.

request 모듈은 HTTP 요청을 파일로 그리고 파일로부터 스트림하기 위해 파일 시스템 모듈과 결합을 할수도 있다. 다음 예제도 sitepoint 홈페이지를 가져 오는 것이다. 하지만, 콘솔에 소스코드를 보여주는 대신에 “sitepoint.htm”이라는 파일로 저장한다.

var request = require("request");
var fs = require("fs");
request("http://www.sitepoint.com").pipe(fs.createWriteStream("sitepoint.htm"));

Parameterizing Requests

앞의 예제들은 URL에 대해 간단한 GET 요청을 만들고 있다. 하지만 우리는 request()의 첫번째 인자로 설정 객체를 전달함으로써 HTTP 요청을 수정할 수 있다. 아래 예제 역시 sitepoint 홈페이지를 다운로드하는 것이지만 더 강력한 구문을 사용하고 있다. 숫자형의 설정 파라미터에 주의해야 하며 uri와 method 파라미터는 sitepoint에 GET 요청을 보내라고 request에게 알려준다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
  method: "GET",
  timeout: 10000,
  followRedirect: true,
  maxRedirects: 10
}, function(error, response, body) {
  console.log(body);
});

timeout 파라미터는 응답을 포기하기전에 10,000 밀리초(10초)동안 기다리라고 request에게 알려주는 것이며, 마지막 두개의 파라미터는 리다이렉션 처리를 해준다. 많은 페이지들이 사용자가 인식하지 못하는 사이에 보이지 않게 리다이렉션을 수행한다. followRedirectmaxRedirects 파라미터는 3xx HTTP 리다이렉션을 최대 10개까지 처리하라고 request에게 알려준다. 또한, request()는 여기에서 보여주지 않은 다른 많은 파라미터들을 지원한다.

Submitting Form Data

앞에서 언급했듯이 request는 GET 요청뿐만 아니라 더 많은 것을 지원한다. 아주 일반적인것 중 하나가 POST 요청을 사용하여 폼 데이터를 제출하는 것이다. 다음 예제는 POST의 한 부분으로 사용자의 이름을 전송하기 위해서 request()의 form 파라미터를 사용한다. 그러면 PHP 페이지가 사용자에게 응답을 하는데 전송한 이름으로 인사 메시지를 보여줄 것이다.

var request = require("request");
request({
  uri: "http://www.cjihrig.com/development/php/hello_form.php",
  method: "POST",
  form: {
    name: "Bob"
  }
}, function(error, response, body) {
  console.log(body);
});

Dealing with Cookies

많은 사이트들이 쿠키를 사용해서 사용자와의 다양한 상호작용을 추적한다. 쿠키는 모든 HTTP 전송간에 클라이언트와 서버 사이에서 왔다 갔다 전송되는 작은 데이터 조각들이다. 쿠키의 사용을 용이하게 하기 위해서 request는 jar()와 cookie() 메서드를 제공한다. 다음 예제의 3 라인을 보면 사용자의 이름을 명시한 쿠키를 생성했다. 그 다음 2 라인에서 생성한 cookie jar에 그 쿠키를 추가했다. HTTP 요청을 만들때 jar 파라미터는 서버에 cookie jar를 전송하기 위해 사용된다.

var request = require("request");
var jar = request.jar();
var cookie = request.cookie("name=John");
jar.add(cookie);
request({
  uri: "http://www.cjihrig.com/development/php/hello_cookies.php",
  method: "GET",
  jar: jar
}, function(error, response, body) {
  console.log(body);
});

응답을 받게 될 때 사용자는 쿠키에 저장되어 있던 이름인 John으로 인사 메시지를 받을 것이다. cookie jar는 또한 서버에 의한 어떤 변화에도 업데이트가 된다. 요청을 보내기 전과 후에 cookie jar를 출력해 보면, 서버가 쿠키의 값을 “John”에서 “Stranger”로 변경한 것을 알 수 있다. 사이트와 사용자간에 실제 상호작용을 묘사하기 위해서 같은 cookie jar를 HTTP 요청에 연속으로 보낼수 있다.

Conclusion

이번 글에서는 간단하지만 강력한 request 모듈에 대해서 소개를 했다. 이번 글이 포괄적이지는 않기 때문에 request가 할 수 있는 다른 것들을 알아보기 위해서는 최소한의 문서들을 검색해봐야 할 것이다. 곧 나올 글에서 request를 더 심도있게 사용한 웹 스크래핑에 대해서 다룰 계획이니 계속 지켜봐 주길 바란다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, nodejs


[번역] Cloud Deployment of Node.js Applications with Nodejitsu, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js

 원문 sitepoint.com의 Cloud Deployment of Node.js Applications with Nodejitsu

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Cloud Deployment of Node.js Applications with Nodejitsu

오늘은 Nodejitsu를 사용하여 클라우드에 Node.js 애플리케이션을 배포하는 방법을 알아볼 것이다.

About Nodejitsu

뉴욕의 중심부에 본사가 있는 Nodejitsu는 클라우드 컴퓨팅을 서비스하는 기업이다. Node.js를 주력으로 platform as a service(PaaS)를 제공하고 있다. 또한 그들의 클라우드에 애플리케이션을 쉽게 배포할 수 있는 도구를 제공한다. 그리고 여러분들 자신의 하드웨어(시스템)에 Node.js 클라우드 서비스를 구축하기 위해 사용할 수 있는 Haibu(Japanese for hive)라는 무료 도구도 제공을 한다. 최소한 Haibu에 대해서 언급은 해야겠지만, 오늘은 Nodejitsu 프로덕션 스택을 위주로 이야기를 할 것이다.

Signing Up with Nodejitsu

Nodejitsu 클라우드를 사용하려면 계정을 등록해야 한다. 다행이도 Nodejitsu는 개인 개발자들에게는 무료로 제공할 계획이다. 계정 등록을 위해 Nodejitsu 홈페이지로 가보자. “Try Nodejitsu for free” 버튼을 찾아 클릭한다. 그리고, 새로운 사용자명을 생성하고 이메일 주소를 등록한다. Nodejitsu에 배포하려는 애플리케이션의 유형에 대한 설명을 선택적으로 추가할 수 있다.

등록신청이 제출되면 추가적인 설명이 있는 확인 이메일을 받게될 것이다. 당신은 jitsu라는 Nodejitsu의 명령행 유틸리티 모듈을 설치해야 한다. npm으로 jitsu를 설치하려면 다음의 명령을 사용해라. Unix 시스템상에서는 sudo를 사용해서 명령을 실행해야 한다.

$ npm install jitsu -g

다음으로 jitsu를 사용해서 당신의 계정을 확인하자. 당신이 받은 확인 이메일에는 아래 보이는 것과 유사한 명령이 포함되어 있어야 한다. 명령을 실행한 후에는 새로운 계정을 위한 비밀번호를 생성하라는 메시지가 나올 것이다. 비밀번호를 생성하면 이제 애플리케이션을 배포할 준비가 된 것이다!

$ jitsu users confirm your_username confirmation_code

Creating a Nodejitsu Application

sitepoint는 최근에 작성했던 글에서 Node.js 기반의 아주 기본적인 HTTP 서버를 만들었었다. 이 간단한 웹서버를 사용해서 우리의 첫번째 Nodejitsu 애플리케이션을 만들 것이다. 웹서버의 코드는 아래 보이는 것과 같다. 이 코드를 작성하고 “web_server.js”라는 이름으로 저장하자.

var http = require("http");
var server = http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("<!DOCTYPE \"html\">");
  response.write("<html>");
  response.write("<head>");
  response.write("<title>Hello World Page</title>");
  response.write("</head>");
  response.write("<body>");
  response.write("Hello World!");
  response.write("</body>");
  response.write("</html>");
  response.end();
});
server.listen(80);

다음으로 jitsu를 사용해서 애플리케이션을 배포한다. 명령은 아래와 같다.

$ jitsu deploy

The package.json File

애플리케션이 배포되기 전에 “package.json” 파일이 필요하다. Node.js에서 프로젝트들은 프로젝트에 대한 메타 데이터를 명시한“package.json” 파일을 포함해야만 한다. 파일 확장자에서 알 수 있듯이 “package.json”은 JSON 데이터 형식으로 되어 있다. 일반적인 패키지 파일은 패키지 이름, 의존성 정보, 버전 정보, 그리고 기타 관련 설정 데이터를 포함할 것이다.

“package.json” 파일 없이 프로젝트를 배포하려고 하면, jitsu는 짧은 위저드(마법사)를 통해 몇단계를 거친 후 파일을 생성할 것이다. 아래 보이는 목록처럼 관련 위저드 데이터를 입력한다. App name은 애플리케이션 이름이고 애플리케시션에 접속하기 위해서는subdomain을 사용할 것이다. 따라서, subdomain은 당신의 사용자명을 포함해야만 한다. scripts.start 필드는 애플리케이션을 실행하는데 사용할 스크립트 파일을 가리킨다. version 필드는 애플리케이션의 버전을 표시하고, 마지막으로 모든 0.8 버전이 우리의 목적에 부합하기 때문에 engines.node의 값은 지정할 필요는 없다.

App name: web_server

subdomain: webserver.your_username

scripts.start: web_server.js

version: 1.0.0

engines.node: (0.8.x)

위저드가 끝나면 아래 보이는 것과 유사한 package.json 파일이 생성될 것이다.

{
  "scripts": {
    "start": "web_server.js"
  },
  "version": "1.0.0",
  "engines": {
    "node": "0.8.x"
  },
  "name": "web_server",
  "subdomain": "webserver.your_username"
}

마지막으로 설정을 확인하기 위해 yes를 입력한다.

Conclusion

모든 것이 정확히 설정됐다면 당신의 웹서버는 지금 Nodejitsu 클라우드에서 실행되고 있어야 하며 그 서버에는http://subdomain.jit.su 주소로 접속할 수 있다. 앞의 URL 중 subdomain은 “package.json” 파일의 subdomain 값으로 대신 사용해야 한다. 예를 들어 내 서버의 경우는 http://webserver.cjihrig.jit.su 주소를 사용한다.

물론 이것은 Nodejitsu의 빙산의 일각일 뿐이다. jitsu에 대해 실험해 보기를 바란다. 예를 들어 jitsu apps를 실행하면 당신의 애플리케이션들을 관리하기 위한 명령어들의 목록을 확인할 수 있다. Nodejitsu 핸드북도 확인해 보면 좋을 것이다.

우리 sitepoint 독자들 중 Nodejitsu에 대한 경험이 있는 사람이 혹시 있는지...?

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] HTTP Authentication in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js

 원문 sitepoint.com의 HTTP Authentication in Node.js(http://sitepoint.com/http-authentication-in-node-js/)

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

HTTP Authentication in Node.js

지난주 Creating a HTTP Server in Node.js에서 Node.js의 기본적인 HTTP에 대해서 알아 보았다. 오늘은 Node.js로 만든 사이트를 HTTP 인증을 사용하여 암호로 보호하는 방법을 보여줄 것이다. 먼저 기본접근인증(basic access authentication)에 대해서 살펴본 후 더 안전한 요약접근인증(digest access authentication)에 대해서 알아볼 것이다.

Basic Access Authentication

인증이 적용되어 있는 사이트에 사용자가 방문을 하면 사용자명과 비밀번호를 요구하는 입력창이 나타난다. 사용자가 유효한 자격증명(사용자명과 비밀번호)을 제공하면 페이지의 콘텐츠를 보게 되고 아니면 “401 Unauthorized” 응답으로 거부될 것이다. HTTP 인증의 가장 간단한 유형은 기본접근인증이다.

The Password File

서버측에는 모든 사용자명과 암호화된 비밀번호가 패스워드 파일에 저장되어 있다. Node.js의 유틸리티 모듈인 htpasswd는 패스워드 파일을 관리하는 데 사용할 수 있다. htpasswd를 설치하려면 아래의 명령어를 사용한다. npm은 Node.js Package Manager를 의미하며 Node.js에 기본적으로 설치되어 있다. 아래의 명령에서 npm은 Node.js 모듈을 설치하기 위해 사용하며 -g 플래그는 패키지를 전역적(시스템의 PATH 환경변수에 포함되어 있는)으로 설치하게 한다.

$ npm install -g htpasswd

일단 htpasswd가 설치되면 아래의 명령어를 사용하여 새로운 사용자를 생성할 수 있다. 이 예제는 -c 플래그를 사용하여 “htpasswd”라는 이름의 새로운 패스워드 파일을 생성한다. 새로운 파일에는 “foo”라는 이름의 사용자가 추가된다. -b 플래그는 명령행의 일부로 지정한 “bar”를 비밀번호로 설정하게 한다.

$ htpasswd -bc htpasswd foo bar

위 명령을 실행한 후 “htpasswd” 파일을 열어보자. “foo”라는 사용자에 대한 패스워드 파일 항목이 아래와 같이 보일 것이다. 이 행에는 사용자명과 암호화된 비밀번호가 포함되어 있으며 이것이 처음이자 유일한 사용자이기 때문에 파일에는 단 한줄만 있게 된다.

foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=

Node.js Incorporation

다음 단계는 우리의 HTTP 서버에 인증이 지원되도록 추가하는 것이다. 우선은 다음에 나오는 npm 명령을 사용하여 http-auth 모듈을 설치해야만 한다.

$ npm install http-auth

다음으로 “basic_auth_server.js”라는 새로운 파일을 만들고 아래의 코드를 입력하자. 2 라인에서는 http-auth 모듈을 참조하고 있다는 것을 알 수 있다. 3 라인부터 7 라인까지를 보면 구성 객체를 인증 모듈로 전달하고 있다. authRealm 필드는 인증 영역을 정의한다.authFile 필드는 방금 만든 패스워드 파일을 가르킨다. 여기에서 __dirname은 현재 실행중인 스크립트가 존재하는 디렉토리를 참조한다. 이 예제에서는 “htpasswd” 파일이 “basic_auth_server.js”와 같은 디렉토리에 있다고 가정한다. authType 구성 필드는 인증에 사용하는 유형이 무엇인지를 나타낸다. 9 라인에서 기본인증 방식으로 HTTP 연결에 적용되었다. 인증 콜백 함수는 다음 처리를 위해 인증된 사용자명을 제공한다.

var http = require("http");
var auth = require("http-auth");
var basic = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "basic"
});
var server = http.createServer(function(request, response) {
  basic.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

마지막으로 서버를 시작한다. http://localhost 로 서버에 연결할 수 있다. 그러면 사용자명과 비밀번호의 입력창이 나타날 것이다. 앞에서 만든 자격증명을 제공하면 브라우저는 이름과 함께 인사(“Hello foo”)하며 응답할 것이다.

Limitations

기본접근인증의 가장 큰 단점은 자격증명(사용자명과 비밀번호)이 네트워크상에서 평문으로 전송된다는 사실이다. 이와 같은 유형의 인증은 감청을 막기 위해서 보안 연결(예: HTTPS)상에서만 사용해야 한다. 만약 보안 연결이 제공될 수 없다면 기본접근인증 대신에 더 안전한 형식의 인증을 사용해야만 한다.

Digest Access Authentication

요약접근인증은 기본인증에 대한 더욱 안전한 대안이다. 요약인증에서는 비밀번호가 네트워크 전송 전에 암호화된다.

The Password File

요약인증에서도 패스워드 파일을 사용한다. 하지만, 기본인증에서 사용하던 형식과 조금 다르다. 요약인증의 패스워드 파일 형식으로 운영하기 위해 htdigest라는 다른 유틸리티 모듈을 사용할 것이다. 다음의 npm 명령으로 htdigest를 설치하자.

$ npm install -g htdigest

다음으로 아래 보이는 명령어를 사용하여 새로운 패스워드 파일을 생성하자. 역시나 -c 플래그는 “htpasswd”라는 새로운 패스워드 파일을 생성하기위해 사용한다. 이제는 인증 영역 또한 명시해야만 한다. 이번 경우에는 인증 영역을 “Private area”로 지정한 것이다. 이 예제도 사용자명은 “foo”이다. 비밀번호를 명령행에서 직접 지정하지 않은 것을 주목하자. 명령을 실행하자마자 비밀번호를 요구하는 메시지가 나올 것이다.

$ htdigest -c htpasswd "Private area" foo

htdigest 명령을 실행한 후에 새로 생성된 “htpasswd” 파일의 내용을 확인해 보자. “foo”라는 사용자에 대한 항목이 아래처럼 보일 것이다. 요약인증 파일은 사용자명과 암호화된 비밀번호, 그리고 기본인증 파일에는 포함되지 않았던 인증 영역까지 포함하고 있다.

foo:Private area:b8e1b1c08abcd38173a7dba3ad93a0c3

Node.js Incorporation

서버에 요약인증을 통합하기 위해 우리는 다시 http-auth 모듈을 사용할 것이다. 이 튜토리얼을 잘 따라왔다면 그 모듈은 이미 설치가 되어있어야 한다. 다음은 서버를 구현하기 위한 “digest_auth_server.js”라는 새로운 파일을 생성하자. 서버의 코드는 아래 보이는 것과 같다. 이 서버 코드가 기본인증의 서버 코드와 거의 동일한 것을 주목하자. 차이점은 구성 객체의 authType 필드에 있다. 이 경우에는 authType이 “digest”로 설정되었다. 이 서버에도 기본인증 서버와 동일한 방식으로 접근할 수 있다.

var http = require("http");
var auth = require("http-auth");
var digest = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "digest"
});
var server = http.createServer(function(request, response) {
  digest.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

Conclusion

이번 글에서는 기본적인 HTTP 인증에 대해서 다루었다. 여기에서 제공하는 예제를 따라함으로써 여러분의 Node.js 애플리케이션들을 조금 더 안전하게 만들 수 있다. 하지만, 인증 하나만으로는 충분하지 않다는 것을 알아야만 한다. 만약 보안이 우선 관심사라면 여러분의 사이트는 HTTPS를 통해 서비스를 해야만 한다. 앞으로의 글들에는 HTTPS 및 여러 다른 놀라운 Node.js의 특징들에 대해서 살펴볼 것이다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] Creating a HTTP Server in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js

 원문 sitepoint.com의 Creating a HTTP Server in Node.js(http://sitepoint.com/creating-a-http-server-in-node-js/)

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Creating a HTTP Server in Node.js

최근에 작성한 글에서 가장 기본적인 Node.js 프로그램을 소개했었다. 물론 Hello World 프로그램도 괜찮지만, 사실 Node.js는 높은 성능의 확장 가능한 서버 애플리케이션을 작성하기 위한 것으로 더 많이 알려졌다. 이 글에서는 Node.js로 만든 간단한 HTTP 서버를 소개한다.

Running the Server

우선 “web_server.js”라는 파일을 만들고 아래의 코드를 작성 후 저장하자.

var http = require("http");
var server = http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("<!DOCTYPE \"html\">");
  response.write("<html>");
  response.write("<head>");
  response.write("<title>Hello World Page</title>");
  response.write("</head>");
  response.write("<body>");
  response.write("Hello World!");
  response.write("</body>");
  response.write("</html>");
  response.end();
});
server.listen(80);
console.log("Server is listening");

이 서버를 구동시키려면 아래의 명령어를 실행해라. 정상적으로 실행이 된다면 “Server is listening”이라는 메시지를 보게될 것이다. 예제의 서버가 HTTP의 표준 포트인 80번 포트에 바인딩하고 있다는 것에 주목하자. 이 포트가 시스템에서 이미 사용중이거나 제한되어 있다면 에러가 발생할 것이다.

$ node web_server.js

다음은 웹 브라우저를 사용해서 서버에 연결해 볼 차례이다. 원하는 브라우저를 실행하고 다음 링크 중 하나를 직접 연결한다. 네트워크 측면에서 localhost(및 로컬호스트의 IP인 127.0.0.1)는 현재 사용중인 시스템을 가르킨다. 브라우저가 “Hello World!”라고 보여주면 정상인 것이다.

http://localhost
http://127.0.0.1

How the Server Works

이제 서버가 이상없이 실행되고 있으니 코드를 분석해 볼 차례이다. 첫번째로 살펴봐야 할 것은 1 라인에서 require()를 호출하고 있다는 것이다. Node.js는 대형 개발자 커뮤니티를 통해 간단한 모듈 시스템을 제공한다. Node.js 프로그램은 require() 메서드를 사용해서 각각의 모듈을 로드할 수 있다. 많은 모듈들의 경우 다운로드해서 사용해야 하지만, http와 같은 특정 모듈들은 Node.js 설치 시 포함되어 있다.

2 라인에서는 http 모듈의 createServer() 메서드를 사용해서 HTTP 서버를 생성했다. 대부분의 Node.js 함수와 마찬가지로createServer() 도 콜백 함수를 인자로 받는다. 이 콜백 함수는 서버가 새로운 요청을 받을때마다 매번 실행된다.

이 콜백 함수에서는 request와 response라는 두개의 인자를 받는다. request 객체는 URL, HTTP 헤더 등과 같은 클라이언트의 요청에 관한 정보를 포함하고 있다. 마찬가지로 response 객체는 클라이언트에게 데이터를 돌려보내는데 사용한다.

위 콜백 함수는 response.writeHead() 메서드의 호출로 시작한다. 이 메서드는 클라이언트에 HTTP 상태 코드와 response 헤더의 컬렉션을 보낸다. 여기서 상태 코드라는 것은 요청에 대한 결과를 가르키는 것이다. 예를 들면, 모든 사람들이 “페이지를 찾을 수 없다”는 것을 나타내는 404 에러를 만난 적이 있을 것이다. 위 예제의 서버는 “성공”을 나타내는 200 코드를 반환한다.

그 상태 코드에 따라서 서버는 응답의 파라미터들을 정의하고 있는 여러 HTTP 헤더를 반환하게 된다. 직접 헤더를 명시하지 않아도 Node.js는 암묵적으로 헤더를 전송한다. 예제의 서버는 Content-Type 헤더만을 명시하고 있다. 이 헤더는 응답의 MIME 타입을 정의한다. 응답이 HTML인 경우에 MIME 타입은 “text/html”이다.

다음으로 서버는 response.write()를 여러번 호출한다. 이것은 HTML 페이지를 작성하기 위해서 사용되는 것이다. 기본적으로 UTF-8 문자셋으로 인코딩된다. 성능 향상을 위해 기술적으로는 하나의 호출로 합치면 좋겠지만, 이 정도의 예제에서는 코드 가독성을 위해서 성능은 신경쓰지 않았다.

HTML 페이지를 모두 작성한 후에는 response.end() 메서드를 호출한다. 이 메서드를 호출함으로써 응답 헤더와 본문이 전송되고 요청에 대한 처리가 완료된다. 예제의 서버에서는 아무 파라미터 없이 end()를 호출하지만, 단지 한번의 호출만 필요하다고 가정한다면 write()와 같은 방식으로 호출될 수 있다.

15 라인에서는 listen()을 호출하여 서버에 포트를 바인딩하고 연결 요청을 리스닝하게 된다. 컴퓨터들은 종단간 통신에 사용되는 수천개의 포트를 가지고 있다. 서버에 연결하기 위해서는 클라이언트들은 서버가 리스닝하고 있는 포트를 정확히 알아야만 한다. HTTP 서버가 전통적으로 80번 포트를 사용하듯이 포트들은 각각의 포트 번호로써 식별된다.

Conclusion

이 글에서는 아주 기본적인 HTTP 서버를 보여줬다. 현재 상태로는 서버가 하나의 HTML 페이지만을 반환할 뿐이다. 다음주에는 파일 시스템으로부터 웹 페이지를 읽거나 HTTP 인증을 통합하는 것과 같은 추가적인 특성에 대해서 살펴보는 등 Node.js에 대해서 더 자세히 알아볼 것이다.



저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] An Introduction to Node.js, #Haroopress


지난번 sitepoint.com의 Introduction to Node.js Streams(http://sitepoint.com/introduction-to-streams/)를 번역 했었다. Node.js의 stream에 대해서 살펴보다 번역을 하게된 것인데, 자세히 보니 Node.js 카테고리에 8개의 article이 더 있었다. article 별로 내용이 그리 길지 않은 것 같아서 시간이 되는대로 처음부터 하나씩 번역을 해보기로 했다.

 원문 sitepoint.com의 An Introduction to Node.js(http://sitepoint.com/an-introduction-to-node-js/)

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

An Introduction to Node.js

JavaScript는 오랬동안 클라이언트측 웹 개발을 위한 사실상 표준이었다. 대부분의 클라이언트 코드가 JavaScript로 작성되는 반면 서버측 개발은 PHP, Java 그리고 여러가지 다른 기술들과의 매시업으로 이루어진다. 만약 하나의 언어가 어디서나 사용된다면 웹 개발자의 인생은 훨씬 편해질 것이다. 브라우저에서는 JavaScript가 지배적이기 때문에 서버에서 사용하는 것도 그럴 듯해 보인다.

서버측 JavaScript라는 발상은 새로운 것은 아니다. 처음에는 1994년에 Netscape에서 JavaScript를 서버 영역에 소개했다. 그 이후 JavaScript를 서버측 언어로 대중화 시키기 위한 몇몇의 프로젝트가 시도됐지만 실패하고 말았다. 실제 서버 영역에서 기반을 확보하기에는 성능상의 문제로 JavaScript의 사용을 금기시했다.

지난 수년간 JavaScript는 성능이 크게 향상되었다. 브라우저와의 연관성으로 인해 구글과 같은 대형 벤더에서 JavaScript를 가능한 빠르게 만들기 위해 많은 시간과 비용을 투자했다. Joyent의 Ryan Dahl(라이언 달)은 2009년에 Node.js 프레임워크를 만들 당시 서버상에서도 훌륭하게 사용될만한 성능을 새롭게 찾아 모든 것을 집약시켰다. 그는 구글의 V8 JavaScript 엔진을 기반으로 Node.js를 만들었다. V8은 구글 크롬에게 아주 훌륭한 JavaScript 성능을 가져다 주어 지구상에서 가장 대중적인 브라우저로 만들어 준 바로 그 엔진이다.

The Node.js Execution Model

아파치와 같은 많은 서버들은 여러 동시 접속을 처리하기 위해 스레드 풀을 유지 관리한다. 새로운 연결이 설정될 때는 그것을 처리하기 위해 별도의 스레드에게 위임한다. 어떤 요청이 처리되어 서비스되면 그 스레드는 향후 다른 요청에 재사용하기 위해 스레드 풀로 다시 반환된다. 이러한 방법의 문제점은 확장성이 부족하다는 것이다. 예를 들면, 많은 웹 애플리케이션들이 연결이 끊기지 않고 무한정 접속되어 있는 AJAX 연결을 만들어서 사용 가능한 모든 스레드들을 소비하게 된다.

Node.js는 요청을 처리하기 위해 완전히 다른 방법으로 접근하고 있다. Node.js 실행 모델은 이벤트 중심(event-driven)이고 확장성을 극대화하기 위해 비동기(asynchronous) 프로그래밍을 강조하고 있다. 또한, 싱글스레드(single-threaded)라는 가장 큰 약점을 감추기 위해넌블러킹(non-blocking) I/O를 활용한다. 개발자들은 “하나의 블러킹 I/O를 호출하는 것이 잠재적으로 전체 서버를 멈추게 할 수 있다”는 제한사항을 항상 알고 있어야 한다. Node.js 환경에서는 많은 함수들이 콜백 함수(I/O 이벤트가 완료되면 실행되는 함수)를 사용한다. 일부 개발자들의 경우 처음에는 이런 코딩 스타일을 어색해 하지만 사실은 웹페이지상에서 이벤트를 처리하는 것과 다를게 없다.

Getting Started with Node.js

Node.js를 사용하는 것은 무료이며, 프로젝트 홈페이지(공식 웹사이트)에서 다운로드할 수 있다. Windows, Mac, Linux 그리고 SunOS를 위한 바이너리 버전과 소스 코드 모두 사용 가능하다. 다운로드하고 설치하면 바로 Node.js 애플리케이션 개발을 시작할 수 있다.

아래에 보이는 것은 “Hello World”를 출력하는 가장 간단한 Node.js 프로그램이다. 이 예제는 터미널 창에 메시지를 보여주기 위해 내장 객체인 console 객체를 사용한다. “hello.js”라는 새로운 파일을 만들고 아래의 코드를 복사해 보자.

console.log("Hello World!");

이 예제를 실행시키려면 터미널 창에 다음의 명령어를 실행한다.

$ node hello.js

Node.js가 제대로 구성되어 있다면 터미널 창에 “Hello World!”가 출력될 것이다. 다들 알겠지만 이 예제는 Node.js가 할 수 있는 것들 중 극히 일부일 뿐이다. 다음주에는 Node.js에 대해서 더 자세히 살펴볼 것이다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js

티스토리 툴바