본문 바로가기

Language/JavaScript

[nodejs] [ Mongo DB ] mongoose를 이용해 mongoDB 사용하기 > 1. 연결하기

[출처] https://onemooon.tistory.com/entry/Node-JS-module-mongoose%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-mongoDB%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90


기본적인 Mongoose 사용법을 차근차근 포스팅 하고자 한다.


연결하는데는 크게 문제 없었는데 warning 하나가 뜨면서 약간의 connection 수정을 여기에 적어보겠다.


일단 핵심 모듈인 mongoose 를 받는다


1
2
3
const mongoose = require('mongoose');
 
//npm i mongoose --save || yarn add mongoose --save
cs


var 대신에 const를 쓰는 이유는 이 mongoose 모듈은 변할 필요가 없기 때문이다. const와 var의 차이는 MDN 문서에 자세히 나와있다.


나는 mongoDB를 mlab.com 이라는 곳에서 무료 호스팅을 통해서 이용하고 있다.


나중에 한번 포스팅을 할 예정이고 생각보다 어렵지 않으니 구글링을 통해서 mlab.com 계정을 만든 뒤 따라하는 것을 추천한다.


그 다음에 이 글을 쓰는 핵심인 기본 연결에 대해서 살펴보자 일단 코드를 바꾸기 전 이전 코드를 먼저 써보겠다 .


1
2
3
4
5
6
7
mongoose.connect('mongodb://'+secret.databaseString+'@ds00000.mlab.com:00000/name',opts);
 
var db = mongoose.connection;
db.on('error'console.error.bind(console'connection error:'));
db.once('open',function(){
  console.log('FreshbankdDB DataBase is connected with mongoose!');
});
cs


그 다음 아래 바꾼 현재 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// DataBase
const DB_options = {
    useMongoClient: true,
    autoIndex: false// Don't build indexes
    reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
    reconnectInterval: 500 , // Reconnect every 500ms
    poolSize: 10 , // Maintain up to 10 socket connections
    // If not connected, return errors immediately rather than waiting for reconnect
    bufferMaxEntries: 0,
    promiseLibrary: require('bluebird')
}
mongoose.connect(
    _localhost? config.DB_String : process.env.DB_String
    , DB_options ).then(
    () => { console.log('DataBase is connected'); } ,
    err => { console.error.bind(console,'Check DB - Connection error : '); }
)
 
cs


자 어떻게 보면 위의 것이 더 간단해 보일 수가 있지만 예전에는 localhost 체크나 options를 주지 않았기 때문이다 동일한 체크를 했다면 더 복잡했을 것이다.


눈에 띄는 차이점은 options를 넣는 것과 error 와 open 이벤트를 한번에 처리한다는 점이다. 하나하나 살펴보자


// DataBase
const DB_options = {
    useMongoClient: true,
    autoIndex: false// Don't build indexes
    reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
    reconnectInterval: 500 , // Reconnect every 500ms
    poolSize: 10 , // Maintain up to 10 socket connections
    // If not connected, return errors immediately rather than waiting for reconnect
    bufferMaxEntries: 0,
    promiseLibrary: require('bluebird')
}


DB option 이다 Warning 페이지를 살펴보니 이러한 옵션과 더불어서 사용하라고 하였다. 

( 자세한 내용을 참고하고 싶다면 mongoose-connection-docs에 options에 나와있다. )


useMongoClient > 4.11 버전부터 새로운 어플리케이션을 만든다면 true로 할당한다는 말이다.


autoIndex > mongoose가 실행될때 자동으로 index관련 설정을 해주는데 간단한 어플리케이션에서는 좋지만 큰 어플리케이션에서는 오히려 퍼포먼스가 떨어질 수 있다고 한다. 상황에 맞춰서 true/false 로 설정하자. 기본은 flase이다.


reconnectTries > 이름만 봐도 알듯이 얼마나 연결할 것인지 묻는 설정이다. 주석을 보면 알듯이 굳이 다르게 지정해 줄 필요가 없다 . 상황에 맞춰 바꾸자


reconnectInterval > 연결 재시도를 몇초 간격으로 할 것인지 설정 해준다.


poolSize > MongoDB 드라이버에서 얼마만큼의 소켓을 열어 놓을 것인지 묻는다. default 는 5 로 설정이 되어있는데 상황에 맞춰서 바꾸면 될듯 하다.


bufferMaxEntries > MogoDB에 기본적으로 bufferCommand 라는 것이 있는데 이는 어떤 연결이 끊어졌을때 재연결을 기다릴 것인지 묻는 것이다. 0 으로 설정하면 이를 false로 만들어 (bufferCommands to false) 즉시 실패를 호출한다.


promiseLibrary > promise를 사용할때 어떤 모듈을 사용할 것인지 묻는다 ES6가 지원되어야 하고 유명한 모듈은 bluebird가 있다. bluebird 사용법 또한 나중에 포스팅 할 예정이다.

( 참고 MongoDB API / bluebird  )


이제 연결 부분을 살펴보자


mongoose.connect(
    _localhost? config.DB_String : process.env.DB_String
    , DB_options ).then(
    () => { console.log('DataBase is connected'); } ,
    err => { console.error.bind(console,'Check DB - Connection error : '); }
)


mongoose.connect면 끝이다. 


먼저 두개의 인자를 받는데 첫번째 인자는 db_URI 이다. ( 연결하고 싶은 mongoDB host )


mlab을 사용한 기준으로 URI를 작성하자면 mongodb://<dbuser>:<dbpassword>@ds00000.mlab.com:00000/db_name 이렇게 될것이다. mlab 페이지에서 DB를 만들면 관리 페이지 상단에서 확인할 수 있다. 이를 _localhost에 따라서 다른 경로에 넣은 것이다.


나 같은 경우는 _localhost라는 Boolean 변수를 만들어 _localhost 변수가 true 라면 .gitignore에 등록한 config라는 모듈을 가져와 uri를 처리하였고,

호스팅 하였을 경우는 _localhost 변수가 false 가 되어 지정해놓은 process.env.DB_string 을 처리하였다.


두번째 인자로는 위에서 작성한 DB_options를 넣는다.


그 다음 .then 이 보이는데 then은 ES6에서 새로나온 메서드이다. (참고 MDN.then )


위의 connect가 성공했을때 then을 실행한다고 생각하면 된다. 케이스에 따라서 성공하였을 경우 () => {} 라는 에로우펑션을 통해서 console을 찍으면 될것이고,

실패하였을 경우 err라는 값을 넘긴 console을 찍으면 될것이다. bind는 .error메서드를 console이라는 객체에서 사용할 수 있게끔 만들어 준다는 뜻이다.