Node.js & MongoDB

util 모듈 사용

문자열 가공

Node.js는 util 모듈을 통해 다양한 문자열을 처리하는 기초 함수들을 제공한다.

util.format() 함수는 첫번째 전달인자로 가공 형식 문자열을 입력 받고, 문자열을 가공한 결과를 반환한다. 다음은 format() 함수의 문법이다.

util.format(format, [...]);

format은 가공 형식 문자열이고, [...]는 추가될 수 있는 전달인자들이다.

format 전달인자는 문자형으로 0이나 다른 대체문자를 포함할 수 있다. 다음과 같은 대체 문자를 사용할 수 있다.

  • %s : 문자형을 정의한다.
  • %d : 숫자형을 정의한다(정수 혹은 실수).
  • %j : 문자형으로 변환 가능한 JSON 객체를 정의한다.
  • % : 비어 있다면 대체문자로 동작하지 않는다.

format()을 사용할 때 다음을 주의해야 한다.

  • 대체문자만큼 전달인자가 존재하지 않다면, %s와 같은 대체 문자는 변환되지 않는다.

      util.format('%s = %s', 'Item1');    // 'Item1'=%s
    
  • 대체문자보다 전달인자가 더 많다면, 추가로 명시된 전달인자들은 공백 구분자로 연결해 하나의 문자열로 변환된다.

      util.format('%s = %s', 'Item1', 'Item2', 'Item3');  // 'Item1 = Item2 Item3'
    
  • 첫번째 전달인자가 가공 형식 문자열이 아니라면, util.format()은 각 전달인자를 문자열로 변환하고 공백 구분자로 연결해 하나의 문자열로 생성해 반환한다.

      util.format(1, 2, 3);   // '1, 2, 3'
    

객체 형식 확인

종종 어떤 명령에 의해 돌려받은 객체가 어떤 형식인지를 확인하는 것이 필요하다.

util 모듈은 객체가 Array 혹은 RexExp, Date, Error 객체 형식인지를 확인하기 위해 isArray(object)isRegExp(object), isDate(object), isError(object)와 같은 편리한 함수를 제공한다.

util.isArray([1,2,3]);  // true

출력 스트림에 동기화해서 쓰기

util 모듈의 유용한 특징 중 하나는 stdout`이나 stderr 출력 스트림에 데이터를 동기화 모드로 슬 수 있다는 점이다. 동기화 쓰기는 데이터를 다 쓸 때까지 프로세스를 블록킹하는 것을 의미한다. 따라서 데이터를 쓰는 동안 시스템은 데이터를 변경하는 동작을 할 수 없다는 것을 보장한다.

동기화 데이터 쓰기를 사용하려면 쓰기 동작을 완료할 때까지 프로세스를 블로킹하는 함수를 사용한다.

  • util.debug(string) : string을 전달받아 stderr에 값을 쓴다.
  • util.error([...]) : 다중 전달인자를 전달받아 stderr에 값을 쓴다.
  • util.puts([...]) : 다중 전달인자를 전달받아 stdout에 값을 쓴다.
  • util.print([...]) : 다중 전달인자를 전달받아 각각을 문자형으로 변환하고 stdout에 값을 쓴다.
  • util.log(string) : string으로 전달받아 타임스탬프와 함께 stdout에 값을 쓴다.

자바스크립트 객체를 문자열로 변환

util.inspect() 함수는 객체를 점검하고 객체의 값을 문자열로 표현해 반환한다.

util.inspect(object, [options])

object 전달인자는 문자열로 변환해야 할 자바스크립트 객체를 나타낸다. options 메소드는 문자열을 가공하는 과정의 몇 가지 과정을 제어할 수 있다. options는 다음 속성을 포함한다.

  • showHidden, depth, colors, customInspect

출력결과를 원하는 대로 생성하기 위해 객체에 직접 inspect() 함수를 정의할 수 있다.

var obj = {first: 'Brad', last: 'Dayley'};
obj.inspect = function(depth){
    return '{name: "' + this.first + " " + this.last + '"}';
};
console.log(util.inspect(obj));     // {name: "Brad Dayley"}

기타 객체의 기능들을 상속

util.inherits() 메소드는 기타 객체의 prototype 메소드들을 상속받는 객체를 생성할 수 있다. 새 객체를 생성할 때 prototype 메소드는 자동 적용된다.

util.inherits(constructor, superConstructor);

prototype의 constructor는 prototype의 superConstructor로 설정되고, 새로운 객체가 생성될 때 실행된다. constructor.super_ 속성을 사용하면 직접 생성한 객체의 생성자에서 superConstruct를 접근할 수 있다.

다음은 inherits()를 사용해 events.EventEmitter 객체의 생성자를 상속받아 Writable 스트림을 생성한 예다.

var util = require("util");
var events = require("events");
function Writer() {
  events.EventEmitter.call(this);
}
util.inherits(Writer, events.EventEmitter);
Writer.prototype.write = function(data) {
  this.emit("data", data);
};
var w = new Writer();
console.log(w instanceof events.EventEmitter);
console.log(Writer.super_ === events.EventEmitter);
w.on("data", function(data) {
    console.log('Received data: "' + data + '"');
});
w.write("Some Data!");

위 코드에서 console.log(w instanceof events.EventEmitter)는 객체가 event.EventEmitter의 인스턴스임을 확인한다. 또한 console.log(Writer.super_ === events.EventEmitter)Writer.super_의 값이 eventsEmitter 라는 것을 보여준다.