Node.js 가 퍼지면서 동시에 가장 많이 퍼진 데이터베이스는 
몽고디비가 당연 압권이죠..
그런데 
이놈이 그리 가볍지는 않습니다. 
노드를 사용하면서 가볍게 사용할 만한 NoSQL 디비가 
생각보다 많지 않습니다.
이럴때 등장한 것이 TingoDB 죠..
이 디비는 몽고디비와 API 호환성을 가지면서 로컬 디비입니다. 
즉 파일 기반으로 디비 서버가 없고 라이브러리 형식의 디비입니다. 
그러면서 몽고디비와 많은 부분이 호환됩니다. 
모듈만 설치하면 바로 사용할 수 있고 패키지 배포시 디비설치에 관련된
처리가 따로 없습니다. 
몽고디비와 많은 부분이 유사하기 때문에 가볍게 사용하다가
몽고디비 서버를 운영할 때 아주 작은 부분만 수정하면 확장이 가능하다는 것이
또한 매력입니다. 
이번 강좌는 이 TingoDB 를 한번 소개해 보겠습니다.

3. 설치

TingoDB의 공식 홈페이지는 다음과 같습니다. 
http://www.tingodb.com/
저장소는 다음과 같습니다. 
https://github.com/sergeyksv/tingodb

다음과 같이 설치 합니다. 
$ npm install tingodb
tingodb@0.2.1 node_modules/tingodb
├── safe@0.1.4
├── async@0.9.0
└── lodash@2.4.1
별 문제 없이 모듈이 설치 됩니다. 
4. 간단한 시험

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

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

-----------[tingodb_basic.js]-----------------------------------------------------------

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

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

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

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

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

//====================================================================
'1. 전화번호 컬렉션을 새로 생성합니다.' : function(다음_진행_하기){

console.log( '1. 전화번호 컬렉션을 새로 생성합니다.');

데이터베이스.createCollection( "전화번호", function( 에러, 컬렉션 ){

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 컬렉션 생성 실패' );
return;
}

전화번호_컬렉션 = 컬렉션;

다음_진행_하기(null);
return;

});

},
//====================================================================
'2. 컬렉션 목록을 보여 줍니다.' : function(다음_진행_하기){

console.log( '2. 컬렉션 목록을 보여 줍니다.' );

데이터베이스.collectionNames( function( 에러, 컬렉션들 ){

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 컬렉션 목록 보기 실패' );
return;
}

console.log(컬렉션들);
다음_진행_하기(null);
return;

});

},
//====================================================================
'3. 전화번호에 데이터를 넣습니다.' : function(다음_진행_하기){

console.log( '3. 전화번호에 데이터를 넣습니다.');

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

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

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

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

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 목록 열거 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'5.컬렉션을 삭제합니다.' : function(다음_진행_하기){

console.log( '5. 컬렉션을 삭제합니다.');
전화번호_컬렉션.drop(function( 에러, 처리결과 ) {
if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 목록 컬렉션 삭제 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'6. 컬렉션 목록을 보여 줍니다.' : function(다음_진행_하기){

console.log( '6. 컬렉션 목록을 보여 줍니다.' );
데이터베이스.collectionNames( function( 에러, 컬렉션들 ){

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 컬렉션 목록 보기 실패' );
return;
}
console.log(컬렉션들);
다음_진행_하기(null);
return;

});

},
//====================================================================
'7.삭제한 전화번호를 열거 합니다.' : function(다음_진행_하기){

console.log( '7. 삭제한 전화번호를 열거 합니다.');

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
console.log( '전화번호 목록 열거 실패' );
}else{
console.log( 처리결과 );
console.log( '전화번호 목록 열거 성공' );
}
다음_진행_하기(null);
return;
});
},
//====================================================================
'8. 전화번호 컬렉션을 새로 생성합니다.' : function(다음_진행_하기){

console.log( '8. 전화번호 컬렉션을 새로 생성합니다.');

데이터베이스.createCollection( "전화번호", function( 에러, 컬렉션 ){

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '전화번호 컬렉션 생성 실패' );
return;
}
전화번호_컬렉션 = 컬렉션;
다음_진행_하기(null);
return;
});
},
//====================================================================
'9. 전화번호에 데이터를 넣습니다.' : function(다음_진행_하기){

console.log( '9. 전화번호에 데이터를 넣습니다.');

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

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

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

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

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

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

//====================================================================
'11.홍길동 2 를 찾습니다.' : function(다음_진행_하기){

console.log( '11. 홍길동 2 를 찾습니다.');

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

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '홍길동2 찾기 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'12.홍길동 4 를 찾습니다.' : function(다음_진행_하기){

console.log( '12. 홍길동 4 를 찾습니다.');

전화번호_컬렉션.findOne({ 이름 : '홍길동4' }, function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '홍길동4 찾기 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'13. 홍길동 2의 이름과 전화 번호를 바꿉니다.' : function(다음_진행_하기){

console.log( '13. 홍길동 2의 이름과 전화 번호를 바꿉니다.');

전화번호_컬렉션.update({ 이름 : '홍길동2' }, { 이름 : '홍길동4', 전화 : '010-9123-9002' }, function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '홍길동2 전화번호 바꾸기 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'14.수정된 전화번호를 열거 합니다.' : function(다음_진행_하기){

console.log( '14. 수정된 전화번호를 열거 합니다.');

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '수정된 전화번호 목록 열거 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'15. 홍길동 4의 이름만 바꿉니다.' : function(다음_진행_하기){

console.log( '15. 홍길동 4의 이름만 바꿉니다.');

전화번호_컬렉션.update({ 이름 : '홍길동4' }, {$set:{이름 : '홍길동2'}} , function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '홍길동2 전화번호 바꾸기 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'16.수정된 전화번호를 열거 합니다.' : function(다음_진행_하기){

console.log( '16. 수정된 전화번호를 열거 합니다.');

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '수정된 전화번호 목록 열거 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'17. 홍길동 3을 삭제합니다.' : function(다음_진행_하기){

console.log( '17. 홍길동 3을 삭제합니다.');

전화번호_컬렉션.remove({ 이름 : '홍길동3' }, {w:1},function( 에러, 처리결과 ) {

if( 에러 ) {
console.log( 에러 );
다음_진행_하기( '홍길동3 삭제 실패' );
return;
console.log( 처리결과 );
다음_진행_하기(null);
return;
});
},
//====================================================================
'18.삭제 처리된 전화번호를 열거 합니다.' : function(다음_진행_하기){

console.log( '18.삭제 처리된 전화번호를 열거 합니다.');

전화번호_컬렉션.find().toArray(function( 에러, 처리결과 ) {

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

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

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

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


-----------[tingodb_basic.js]-----------------------------------------------------------