Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

console을 이용해서 node.js 디버깅하기

node.js는 언어는 Javascript이기는 하지만 환경자체는 많이 다르기 때문에 개발을 하려다 보니 디버깅에 대한 필요가 커졌습니다. 가장 간단한 방법은 모든 언어에서 가장 막강한 디버깅방법인 콘솔에 찍어보기 입니다.(무식하지만 이거만한것도 없죠. ㅎ)

간단한 예제를 작성해 보았습니다.

var http = require("http"),
sys = require("sys"),
PORT = 8124,
HOST = "127.0.0.1",
arr = new Array("Outsider", "node.js");

function testFunc() {
    return "test";
}
http.createServer(function(req, res) {
    console.log("Start Server");
    console.log("console.log: " + arr);
    console.log("console.log: " + testFunc);
    sys.puts("sys.puts: " + arr);
    sys.puts("sys.puts: " + testFunc);
    sys.puts("sys.inspect: " + sys.inspect(arr));
    sys.puts("sys.inspect: " + sys.inspect(testFunc));
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World\n");
}).listen(PORT, HOST);

console.log("Server running at http://127.0.0.1:8124/");

콘솔(혹은 터미널)에 출력해 주는 함수는 2가지가 있습니다. Javascript를 쓸때 흔하게 쓰는 console.log()와 sys.puts()입니다. console.log()는 JS에서 제공해주는 것이므로 바로 사용이 가능하고 sys.puts()같은 경우는 require("sys")로 가져와야 사용이 가능합니다. 위 예제를 실행한 후에 웹페이지에서 접속을 하면 콘솔에 로그가 찍힙니다.

Server running at http://127.0.0.1:8124/
Start Server
console.log: Outsider,node.js
console.log: function testFunc() {
    return "test";
}
sys.puts: Outsider,node.js
sys.puts: function testFunc() {
    return "test";
}
sys.inspect: [ 'Outsider', 'node.js' ]
sys.inspect: [Function: testFunc]

위 코드로 찍힌 로그는 위와 같습니다. console.log와 sys.puts는 일단 동일한 결과가 나옵니다. Stackoverflw에 올라온 글을 보면 두 메서드의 차이를 약간 알 수 있습니다. console.log를 여러파라미터를 받을 수 있고 포매팅같은 기능도 지원하고 있습니다. 그리고 첫 파라미터가 스트링이 아닐 경우에는 컨버팅하여서 보여주고 있습니다. 대신에 sys.puts()는 단순히 주어진 파라미터들에 대해서 출력만 해주는 역할을 하고 있습니다. sys.inspect()는 객체의 문자열 표현을 리턴해 주기 때문에 디버깅에 더 유용합니다. 이부분은 node REPL에서 테스트해보면 더 명확하게 알 수 있습니다.

> var sys = require("sys");
> console.log("print %s", "test");
print test
> sys.puts("print %s", "test");
print %s
test
> console.log(sys)
{ print: [Function]
, puts: [Function]
, debug: [Function]
, error: [Function]
, inspect: [Function]
, p: [Function]
, log: [Function]
, exec: [Function]
, pump: [Function]
, inherits: [Function]
}
> sys.puts(sys)
[object Object]
> sys.puts(sys.inspect(sys));
{ print: [Function]
, puts: [Function]
, debug: [Function]
, error: [Function]
, inspect: [Function]
, p: [Function]
, log: [Function]
, exec: [Function]
, pump: [Function]
, inherits: [Function]
}
>

개인적으로는 명확하게 하기 위해서 console.log(sys.inspect())나 sys.puts(sys.inspect())를 사용하는게 낫지 않을까 생각하고 있습니다. sys.puts()대신에 sys.debug()를 사용하게 되면 아래와 같이 출력앞에 DEBUG라고 표시가 되기 때문에 메시지와 디버그 문자열을 구분할 수 있게 되어 좀 더 편합니다.

Server running at http://127.0.0.1:8124/
DEBUG: sys.puts: Outsider,node.js
DEBUG: sys.puts: function testFunc() {
    return "test";
}
DEBUG: sys.inspect: [ 'Outsider', 'node.js' ]
DEBUG: sys.inspect: [Function: testFunc]

2010/10/14 12:21 2010/10/14 12:21