본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

Express - 2장 : MongoDB / Mongoose 세팅하기

by VictorMeredith 2023. 2. 27.

1. mongoDB 사이트에서 가입하고 Collection 만들기

- 가입

- 서버위치 : 한국 - DB Access 에서 ID/PS 설정

- atlas admin 으로 설정

- Network Access에서 IP 추가

- DB Collection 설정

- 프로젝트 폴더로 돌아와서 npm i mongoose

2. Model/Schema 생성(backend/models)

디렉토리구조

User.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({ //스키마 생성자
    userID: {
        type: String, // 타입 설정
        required: true // 필수 설정(true:있어야함, false:optional)
    },
    name : {
        type:String,
        required: true
    },
    userPassword :{
        type:String,
        required:true
    },
    active : {
    	tpye: Boolean,
        default: true //디폴트값을 설정할 수 있다.
    }
},
{versionKey : false} //_v 버전키를 안보고싶으면 false
);

module.exports = mongoose.model('User', userSchema);

 

- 또다른 스키마도 만들어보자.

Post.js(example)

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const postSchema = new Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId, //object id from a schema
        required: true,
        ref: 'User' // 만든 User 스키마를 레퍼런싱한다
    },
    title : {
        type:String,
        required: true
    },
    text :{
        type:String,
        required:true
    },
    completed :{
        type:Boolean,
        required:false
    }
},
{timestamps: true}, // 타임스탬프를 추가할 수 있다.
);

module.exports = mongoose.model('Note', postSchema);

- 비즈니스로직/요구사항에 맞게 적절히 설정한다.

3. mongoose-sequence (자동으로 증가하는 필드 생성 라이브러리)

- npm i mongoose-sequence

 

post.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const AutoIncrement = require('mongoose-sequence')(mongoose); //설치

// ...

postSchema.plugin(AutoIncrement, { //설정
	inc_field:'ticket',
    id:'ticketNums',
    start_seq:500
})

 

3. db연결하기

db.js

const mongoose = require("mongoose");
mongoose.set('strictQuery', false);

const mongooseConnect = async ()=>{
  try{
    await mongoose.connect(process.env.DB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      // useFindAndModify: false,
      // useCreateIndex: true,
    }, ()=>{
      console.log('연결되었습니다 db.js');
    })
  }
  catch(err){
    console.log(err)
  }

}

module.exports = mongooseConnect;

 

server.js

const app = require('./app');
const http = require('http');
const mongooseConnect = require('./db');
const mongoose = require('mongoose');
const { logEvents, logger } = require('./middleware/logger')
const server = http.createServer(app);

mongooseConnect(); //db 연결 호출

mongoose.connection.once('open', ()=>{ //mongoose eventListener
    server.listen(process.env.PORT, ()=>{
        console.log('server.js에서'+process.env.PORT)
    })
})

mongoose.connection.on('error', err => { //mongoose Error log
  console.log(err);
  logEvents(`${err.no}: ${err.code}\t${err.syscall}\t${err.hostname}`, 'mongoErrLog.log');
})

- AppSam의 DB커넥션을 이벤트리스너 기반으로 대체한 결과물 예시.

 

 

4. 서버실행 및 테스트

- 이제 서버를 실행시켜보면

잘 연결되었다!

 

댓글