본문 바로가기
데이터베이스/MongoDB

[mongoose] express + mongoDB 애플리케이션에서 연결/저장/읽기

by devebucks 2021. 6. 9.
728x90

안녕하세요.

이번에 우아한테크러닝에 참여하고 있습니다. 4주동안 진행하는 프로젝트입니다. 프로젝트의 주제는 노션을 만드는 겁니다. 그래서 저는 프로젝트 서버 쪽 구성을 express와 mongoDB를 사용하기로 결정했습니다.

 

제가 express를 결정한 이유

1. 제가 Javascript에 익숙합니다.

2. Node.js 개발 환경을 구축할 수 있습니다. (npm과 babel)

3. 작은 규모의 아키텍쳐에 적합합니다.

 

제가 mongoDB를 결정한 이유

1. 사용하면서 저도 알게 된 거지만, 객체 형식으로 저장합니다. Client에서 POST로 요청한 req.body.json을 아무런 처리 없이 DB에 넣을 수 있는 점이 가장 매력적으로 생각되었습니다.

2. 사용해본 경험이 있고, mongodb atlas라는 클라우드 서비스 무료 버전으로 간단하게 구축할 수 있습니다.

 

 

사용할 기술을 정했으니, express와 mongoDB를 어떻게 연결해야 하는지 방법을 알아봐야 했습니다. 그 과정을 공유합니다.

 

엘레강트한 mongoose

우선, mongoose를 알아봤습니다. mongoose 공식 문서를 쭉 읽어봤습니다. 

mongodb object modeling for node.js

node.js에서 mongodb 객체 모델링을 하는데 사용하는 도구라고 나와있습니다. 

mongodb는 기본 특징이 데이터에 스키마가 없는 NoSQL DB입니다. 하지만, DB와 통신하는 애플리케이션에서 주고받는 데이터에는 타입이 존재합니다. 이런 불일치성을 해소하도록 mongoose는 애플리케이션에서 데이터 타입에 대응하는 스키마 모델을 만들어 줄 수 있습니다.

mongoose provides schema-based solution to model your application data.

 

계속 mongoose 공식 문서를 읽어보니, mongoose의 역할을 추릴 수 있었습니다.

- 데이터 스키마 모델링

- express - 연결 - mongoDB

- save

- query

 

 

express와 mongodb를 연결하는 방법이 mongoose 입니다. mongoose에 대한 설명이 주를 이룹니다.

 

 

mongoose : express + mongoDB 연결 / 저장 / 읽기 

import express from 'express';
import mongoose from 'mongoose';

const app = express();

// express에 내장된 json함수로 post 요청에 대한 body값을 읽어올 수 있습니다.
app.use(express.json());

//연결 방법 1.
mongoose.connect('mongodb+srv://아이디:비밀번호@cluster0.fw2erq6e.mongodb.net/test?retryWrites=true&w=majority'
, { useNewUrlParser: true })
.then(() => { console.log('mongodb connection is success')})
.catch((err) => {console.log(err)});

// 연결 방법 2.
mongoose.connect();
const db = mongoose.connection;
db.on('error', 콜백함수);
db.once('open', 콜백함수);

// mongoose 스키마 정의
const catSchema = new mongoose.Schema({name: string});
// mongoose 모델 정의
const Cat = nomgoose.model('Cat', catSchema);

// mongoose 스키마 모델 정의 동시(model에 schema를 컴파일 해줍니다.)
const Cat = mongoose.model('Cats', {name: string});


//저장
app.post('/saveCat', (req, res) => {
  console.log(req.body);  // {name: 'Tom'}
  const tom = new Cat(req.body);
  tom.save().then(() => { console.log('success')});
}



//쿼리
app.get('/readCat', (req, res) => {
  Cat.find();
});

 

 

mongoose에서 만들어진 model은 class입니다. 이 model은 RDB의 개념으로는 테이블입니다. mongoDB의 개념으로는  document  입니다. express에서 작성된 mongoose의 model은 데이터 저장/읽기/삭제/수정에 사용되는 인스턴스가 됩니다.

 

mongoose의 model 인스턴스에 사용하는 methods

 

save()

인스턴스를 mongoDB document에 저장. 메소드에 첫 번째 인자는 콜백함수가 들어갑니다. 에러를 처리할 수 있습니다.

tom.save((err, tom) => {
  if (err) {
    return console.error(err);
  }
  return console.log(`success ${tom}`);
})

 

 

mongoose model 인스턴스 쿼리 문법

쿼리는 두 가지 방법으로 실행될 수 있습니다.

1. 콜백함수 사용

2. promise then() 사용

 

find()

const Cat = mongoose.model('cat', {name: string});
const query = Cat.find();

query.exec((err, cat) => {
  if(err) {
    console.log(err);
  } else {
    console.log(cat);
  }
})

findOne()

const Cat = mongoose.model('cat', {name: string});
const query = Cat.findOne({'name':'tom'});

query.select('name') // 찾을 필드 설정

query.exec((err, cat) => {
  if(err) {
    console.log(err);
  } else {
    console.log(cat);
  }
})
728x90

댓글