Back-end/Node.js

[Node.js+MongoDB] 몽구스 (1) (Mongoose)

poppy 2021. 7. 20. 15:26
반응형
몽구스란? (Mongoose)
몽구스는 MYSQL 의 시퀄라이즈와 같은 것입니다. 몽구스는 시퀄라이즈와 달리 ODM 이라고 불리는데 그 이유는 MongoDB는 릴레이션이 아니라 다큐먼트를 사용하기 때문입니다. MongoDB 자체가 자바스크립트인데도 굳이 자바 스크리브 객체와 매핑하는 이유는 MongoDB 에 없어서 불편한 기능들을 몽구스가 보완해주기 때문입니다. MongoDB 는 테이블이 없어서 자유롭게 데이터를 넣을 수 있기 때문에 잘못된 자료형의 데이터를 넣거나 다른 다큐먼트에 없는 필드의 데이터를 넣을 수도 있습니다. 이러한 실수를 막기 위해 몽구스는 데이터를 필터링해주는 역할을 합니다. 또, populate 라는 메서드로 관계가 있는 데이터를 쉽게 가져올 수 있습니다.

 

MongoDB 설치법과 계정 설정에 대해서는 다루지 않겠습니다! 기본 세팅이 다 되었다는 가정 하에 시작합니다

 

1. MongoDB 에 컬렉션 생성하기

먼저 컬렉션들을 저장할 데이터베이스를 만듭니다.

use nodejs

 

컬렉션을 생성합니다. 다큐먼트를 넣는 순간 컬렉션이 자동 생성되므로 원래는 컬렉션을 따로 생성하지 않아도 됩니다!

db.createCollection('users')
db.createCollection('comments')

 

2. 몽구스를 사용하기 위한 프로젝트 만들기

다음 명령어를 통해 package.json 을 생성 및 설정합니다.

npm init

 

필요한 패키지들을 설치합니다.

npm install express morgan nunjucks mongoose
npm install -D nodemon

 

3. 몽구스와 몽고디비 연결하기

schemas 폴더를 만들고 index.js 파일을 만듭니다. 이 파일은 몽고디비와 연결하는 파일입니다.

// schemas/index.js
const mongoose = require('mongoose');

const connect = () => {
  // 개발 환경일 때만 콘솔을 통해 몽구스가 생성하는 쿼리 내용 확인
  if (process.env.NODE_ENV !== 'production') {
    mongoose.set('debug', true); 
  }
  // 몽구스와 몽고디비 연결하는 부분
  mongoose.connect('mongodb://root:soohyun@localhost:27017/admin', {
    dbName: 'nodejs',
    useNewUrlParser: true,
    useCreateIndex: true,
  }, (error) => {
    if (error) {
      console.log('몽고디비 연결 에러', error);
    } else {
      console.log('몽고디비 연결 성공');
    }
  });
};

mongoose.connection.on('error', (error) => {
  console.error('몽고디비 연결 에러', error);
});
mongoose.connection.on('disconnected', () => {
  console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.');
  connect();
});

module.exports = connect;

몽구스는 몽고디비에 주소를 사용하여 연결합니다. 주소 형식은 "mongodb://이름:비밀번호@호스트:포트번호/데이터베이스" 입니다. 데이터베이스에는 사용할 데이터베이스가 있는 계정을 넣고, dbName 에 사용할 데이터베이스 이름을 넣으면 됩니다. 

 

app.js 파일을 생성하고 schemas/index.js 와 연결합니다.

const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');

const connect = require('./schemas/index'); // 파일 가져오기
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const commentsRouter = require('./routes/comments');

const app = express();
app.set('port', process.env.PORT || 3000);
app.set('view engine', 'html');
nunjucks.configure('views', {
  express: app,
  watch: true,
});
connect(); // schemas/index 와 연결

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/comments', commentsRouter);

app.use((req, res, next) => {
  const error =  new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});
반응형