tungus 란?

몽고 디비는 기존 데이터베이스에 익숙한 사람에게는
사용이 그리 쉽지 않습니다. 
테이블 형태의 스키마 구조에 익숙한 프로그래머에게 
약간의(?) 고통을 안겨 주죠..
그래서 몽구스(mongoose) 라는 모듈이 등장합니다. 
테이블과 형태로 스키마가 구성된 데이터베이스와 같은 형태로 
아주 간단하게 사용할 수 있도록 해 주는 겁니다. 
TingoDB 는 몽고 디비와 호환성을 가지고 있습니다. 
그래서 몽구스를 사용할 수 있도록 지원하는 모듈이 tungus 입니다. 
이번 강좌는 이 tungus 를 사용하여 mongoose 를 사용해서 
다루는 방법을 소개해 보겠습니다.

설치

tungus 저장소 는 다음과 같습니다. 
https://github.com/sergeyksv/tungus

tungus 는 mongoose 를 지원하는 것이기 때문에 

다음과 같이 tungus 와 mongoose 모두 설치해야 합니다. 

npm install tungus
npm install mongoose

간단한 시험

먼저 컬렉션을 하나 만들고 .. 샘플을 넣고 ... 찾고.. 수정하고.. 지우는 
아주 기본적인 것을 해 보도록 하겠습니다. 
tungus_basic.js 라는 이름으로 만들 겁니다. 
다음이 소스입니다. 
소스

설명이 굳이 필요할까 생각됩니다. 
순차적이고 이벤트처리가 중심이라서 async 모듈을 사용했습니다. 
한글 변수명을 썼는데 덕분에 소스를 그대로 보시고서 이해하실 수 있다고 
생각합니다. 
그래서 따로 설명하지 않겠습니다. 
몽고 디비를 강좌하는 것은 아니라서요 ^^

var async = require( 'async' );
var 차례대로_진행_하기 = async.series;
var 배열을_차례대로_진행_하기 = async.each;

console.log( 'tungus 시험을 진행합니다.' );

console.log( '데이터 베이스와 컬렉션을 선언합니다.');

// var 데이터베이스_모듈 = require('tingodb')().Db;
// var 데이터베이스 = new 데이터베이스_모듈('./db/', {});
// var 전화번호_컬렉션 = null;

var tungus = require('tungus');
var 몽구스 = require('mongoose');
var 테이블_구조 = 몽구스.Schema;

var 전화번호_테이블 = null;

//////////////////////////////////////////////////////////////////////
차례대로_진행_하기({
//////////////////////////////////////////////////////////////////////

//====================================================================
'1. 몽구스와 TingDB 를 연결합니다.' : function(다음_진행_하기){

console.log( '1. 몽구스와 TingDB 를 연결합니다.' );

var TingoDB_디렉토리 = __dirname+'/db/';
console.log( TingoDB_디렉토리 );
몽구스.connect( 'tingodb://'+ TingoDB_디렉토리, function ( 에러 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '데이터 베이스 연결 실패' );
return;
}
console.log( '데이터 베이스 연결에 성공했습니다.' );
다음_진행_하기(null);
return;
});
},
//====================================================================
'2. 테이블 구조를 정의합니다.' : function(다음_진행_하기){

console.log( '2. 테이블 구조를 정의합니다.' );

var 전화번호_테이블_구조  = 테이블_구조( { 이름 : String, 전화 : String } );
전화번호_테이블 = 몽구스.model( '전화번호', 전화번호_테이블_구조 );
다음_진행_하기(null);
return;

},
//====================================================================
'3. 테이블에 하나의 레코드를 추가합니다.' : function(다음_진행_하기){

console.log( '3. 테이블에 하나의 레코드를 추가합니다.' );
var 전화번호_한개  = new 전화번호_테이블( { 이름 : '아무개1', 전화 : '010-0123-0001' } );
전화번호_한개.save(function ( 에러, 전화번호_한개 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '레코드 저장 실패' );
return;
}
console.log( '레코드 저장에 성공했습니다.' );
다음_진행_하기(null);
return;
});

},
//====================================================================
'4. 테이블에 여러개의 레코드를 추가합니다.' : function(다음_진행_하기){

console.log( '4. 테이블에 여러개의 레코드를 추가합니다.' );

var 전화번호_목록 = [
  { 이름 : '아무개2', 전화 : '010-0123-0002' },
  { 이름 : '아무개3', 전화 : '010-0123-0003' },
  ];

배열을_차례대로_진행_하기( 전화번호_목록,  function( 전화번호, 배열_다음_진행_하기 ){
console.log( 전화번호 );
var 전화번호_한개  = new 전화번호_테이블( 전화번호 );
전화번호_한개.save(function ( 에러, 전화번호_한개 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '레코드 저장 실패' );
return;
}
console.log( '레코드 저장에 성공했습니다.' );
배열_다음_진행_하기();
return;
});
},
// 배열에 대한 처리가 모두 끝났을때의 처리 
function(err){
다음_진행_하기(null);
return;
});
},

//====================================================================
'5.넣은 전화번호를 열거 합니다.' : function(다음_진행_하기){

console.log( '5. 넣은 전화번호를 열거 합니다.');

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'6.모든 데이터를 삭제합니다.' : function(다음_진행_하기){

console.log( '6.모든 데이터를 삭제합니다.');

전화번호_테이블.remove({}, function( 에러 ) { 
if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '모든 데이터 삭제 실패' );
  return;
 
다음_진행_하기(null);
return;
});
},
//====================================================================
'7.모든 데이터가 삭제된 테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '7.모든 데이터가 삭제된 테이블을 열거 합니다.');

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'8. 테이블에 여러개의 레코드를 추가합니다.' : function(다음_진행_하기){

console.log( '8. 테이블에 여러개의 레코드를 추가합니다.' );

  var 전화번호_목록 = [
  { 이름 : '홍길동1', 전화 : '010-9123-0001' },
  { 이름 : '홍길동2', 전화 : '010-9123-0002' },
  { 이름 : '홍길동3', 전화 : '010-9123-0003' },
  ];

배열을_차례대로_진행_하기( 전화번호_목록,  function( 전화번호, 배열_다음_진행_하기 ){
console.log( 전화번호 );
var 전화번호_한개  = new 전화번호_테이블( 전화번호 );
전화번호_한개.save(function ( 에러, 전화번호_한개 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '레코드 저장 실패' );
return;
}
console.log( '레코드 저장에 성공했습니다.' );
배열_다음_진행_하기();
return;
});
},
// 배열에 대한 처리가 모두 끝났을때의 처리 
function(err){
다음_진행_하기(null);
return;
});
},
//====================================================================
'9.새로 추가된 데이터의 테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '9.새로 추가된 데이터의 테이블을 열거 합니다.' );

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'10.한개의 데이터를 검색합니다.' : function(다음_진행_하기){

console.log( '10.한개의 데이터를 검색합니다.' );

전화번호_테이블.findOne( { 이름 : '홍길동2' }, function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'11.한개의 데이터를 검색 후 삭제합니다.' : function(다음_진행_하기){

console.log( '11.한개의 데이터를 검색 후 삭제합니다.' );

전화번호_테이블.findOne( { 이름 : '홍길동2' }, function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
처리결과.remove( function( 에러 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 목록 열거 실패' );
return;
console.log( '홍길동2 를 삭제했습니다.' );
다음_진행_하기(null);
return;
  });
  });
},
//====================================================================
'12.테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '12.테이블을 열거 합니다.' );

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'13.한개의 데이터를 삭제합니다.' : function(다음_진행_하기){

console.log( '13.한개의 데이터를 삭제합니다.' );
전화번호_테이블.remove( { 이름 : '홍길동1' } , function( 에러 ) { 
if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '홍길동1 데이터 삭제 실패' );
  return;
 
다음_진행_하기(null);
return;
});

},

//====================================================================
'14.테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '14.테이블을 열거 합니다.' );

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'15. findOne() 을 사용하여 데이터를 수정합니다.' : function(다음_진행_하기){

console.log( '15. findOne() 을 사용하여 데이터를 수정합니다.' );

전화번호_테이블.findOne( { 이름 : '홍길동3' }, function( 에러, 전화번호 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
전화번호.이름 = '홍길동4';
전화번호.전화 = '010-9123-1234';
전화번호.save(function ( 에러, 전화번호 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '레코드 수정 저장 실패' );
return;
}
console.log( '레코드 수정 저장에 성공했습니다.' );
다음_진행_하기(null);
return;
});
  });
},

//====================================================================
'16.테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '16.테이블을 열거 합니다.' );
전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'17. update() 을 사용하여 데이터를 수정합니다.' : function(다음_진행_하기){

console.log( '17. findOne() 을 사용하여 데이터를 수정합니다.' );

전화번호_테이블.update( { 이름 : '홍길동4' }, { 이름 : '홍길동1', 전화 : '010-9123-0001' }, function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 수정 실패' );
  return;
 
console.log( '처리결과 = ' + 처리결과  );
console.log( '레코드 수정에 성공했습니다.' );
다음_진행_하기(null);
return;
  });
},

//====================================================================
'18.테이블을 열거 합니다.' : function(다음_진행_하기){

console.log( '18.테이블을 열거 합니다.' );

전화번호_테이블.find( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'19. collection.insert() 을 사용하여 여러 데이터를 입력 합니다.' : function(다음_진행_하기){

console.log( '19. collection.insert() 을 사용하여 데이터를 수정합니다.' );

  var 전화번호_목록 = [
  { 이름 : '홍길동2', 전화 : '010-9123-0002' },
  { 이름 : '홍길동3', 전화 : '010-9123-0003' },
  { 이름 : '홍길동4', 전화 : '010-9123-0004' },
  { 이름 : '홍길동5', 전화 : '010-9123-0005' },
  { 이름 : '홍길동6', 전화 : '010-9123-0006' },
  { 이름 : '홍길동7', 전화 : '010-9123-0007' },
  { 이름 : '홍길동8', 전화 : '010-9123-0008' },
  { 이름 : '홍길동9', 전화 : '010-9123-0009' },
  { 이름 : '홍길동A', 전화 : '010-9123-0010' },
  { 이름 : '홍길동B', 전화 : '010-9123-0011' },
  { 이름 : '홍길동C', 전화 : '010-9123-0012' },
  ];
전화번호_테이블.collection.insert( 전화번호_목록 , {w: 1}, function( 에러, 처리결과 ) {

  if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 등록 실패' );
  return;
 
 
console.log( '처리결과 = ' + 처리결과  );
다음_진행_하기(null);
return;

  });
},

//====================================================================
'20.테이블을 4개만 열거 합니다.' : function(다음_진행_하기){

console.log( '20.테이블을 4개만 열거 합니다.' );

전화번호_테이블
.find() 
.skip(2).limit(4)
.exec( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'21.특정 필드만 선택합니다.' : function(다음_진행_하기){

console.log( '21.특정 필드만 선택합니다.' );

전화번호_테이블
.find() 
.select('전화')
.exec( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'22. 이름 역순으로 정렬합니다.' : function(다음_진행_하기){

console.log( '22. 이름 역순으로 정렬합니다.' );

전화번호_테이블
.find() 
.sort('-이름')
.exec( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'23. 조건을 겁니다.' : function(다음_진행_하기){

console.log( '23. 조건을 겁니다.' );

전화번호_테이블
.find() 
.where('이름').equals('홍길동6')
.exec( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================
'24. 패턴 조건식을 겁니다.' : function(다음_진행_하기){

console.log( '24. 패턴 조건식을 겁니다.' );

전화번호_테이블
.find() 
.where('이름', /A/)
.exec( function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
  다음_진행_하기( '전화번호 목록 열거 실패' );
  return;
 
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},

//====================================================================

//////////////////////////////////////////////////////////////////////
},// 차례대로_진행_하는 항목 들 끝 표시
//////////////////////////////////////////////////////////////////////
//// 마지막 종료 처리 
//////////////////////////////////////////////////////////////////////
function( 에러, 결과들) {

// 데이터베이스.close();
if( 에러 ) {
console.log( '에러 : ' + 에러 );
process.exit(1);
return;
}
console.log( '모든 처리가 끝났습니다.' );
process.exit(0);
}); 
//////////////////////////////////////////////////////////////////////
//// 순차_처리_하기 끝
//////////////////////////////////////////////////////////////////////