본문 바로가기
공부/express

[Express] mongoose 사용법 (mongoDB ORM)

by 웅대 2024. 5. 14.
728x90
반응형

https://growth-coder.tistory.com/275

 

[Express] sequelize 사용법 (ORM)

https://growth-coder.tistory.com/274 [express] express 웹 서버 기초pacakage.json 생성npm init 명령어로 package.json을 만들어준다. package.json에는 프로젝트가 사용 중인 패키지의 정보가 담겨있다.package.json 문서를

growth-coder.tistory.com

이전 포스팅에서 sequelize와 mysql을 사용하여 ORM 기술을 사용해보았다.

 

이번에는 mongoose와 mongoDB를 사용하여 ORM 기술을 사용해보려고 한다.

 

이번에도 간단하게 Team과 User를 1:N으로 매핑해보자.

 

세팅

먼저 express 서버와 mongoose를 설치한다.

npm install express mongoose

 

schemas 디렉토리를 생성하고 그 안에 index.js 파일을 생성하고 mongoose 기본 세팅을 진행한다.

 

<schemas/index.js>

const mongoose = require('mongoose')

const connect = ()=>{
    if (process.env.NODE_ENV !== 'production'){
        mongoose.set('debug', true)
    }
    mongoose.connect('mongodb://localhost:27017/mongoose_practice')
    .then(()=>{
        console.log("mongodb 연결 성공")
    }).catch((err)=>{
        console.log(err)
    })
    mongoose.connection.on('error', (error)=>{
        console.log(error)
    })
    mongoose.connection.on('disconnected', ()=>{
        console.log("연결 실패 재연결 시도합니다.")
        connect()
    })
}
module.exports = connect

 

이제 이 파일을 import 하는 곳에서 connect 함수를 호출하기만 하면 몽고디비에 연결할 수 있다.

 

스키마 정의

몽고 디비의 collection과 매핑되는 스키마를 정의할 차례이다.

 

Team collection과 User collection이 1:N 연관 관계를 가지고 있는 형태로 스키마를 정의해보자.

 

<schemas/team.js>

const mongoose = require('mongoose')
const {Schema} = mongoose
const teamSchema = new Schema({
    name:{
        type: String,
        required: true
    }
})

module.exports = mongoose.model('Team', teamSchema)

 

<schemas/user.js>

const mongoose = require('mongoose')
const {Schema} = mongoose
const userSchema = new Schema({
    name:{
        type: String,
        required: true
    }, 
    age:{
        type:Number
    },
    team: {
        type: Schema.Types.ObjectId,
        ref: 'Team'
    }
})

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

 

user에서 team을 참조하는 형태로 스키마를 정의하였다.

 

MongoDB 연결 

이제 MongoDB를 연결하고 CRUD api를 만들어보자.

 

const express = require('express')
const connect = require('./schemas/index')
const User = require('./schemas/user')
const Team = require('./schemas/team')
const app = express();
app.use(express.json())
app.listen(3001, ()=>{
    console.log("3001번 포트 서버 실행")
})
connect()

 

MongoDB 연결의 경우 미리 정의한 connect 함수를 가져와서 사용한다.

 

이제 api를 만들어보자.

app.post('/teams', async (req, res)=>{
    const name = req.body.name
    const newTeam = new Team({
        name
    })
    const saveTeam = await newTeam.save()
    res.json(saveTeam)
})
app.get('/teams', async (req, res)=>{
    const teams = await Team.find()
    res.send(teams)
})
app.get('/teams/:id', async(req, res)=>{
    const team = await Team.find({_id : req.params.id})
    res.json(team)
})

app.patch('/teams/:id', async(req, res)=>{
    const team = await Team.findOneAndUpdate({
        _id: req.params.id
    },{
        name: req.body.name
    }, {
        returnOriginal: false
    }
    )
    res.json(team)
})

app.delete('/teams/:id', async(req, res)=>{
    const result = await Team.deleteOne({_id: req.params.id})
    res.json(result)
})

app.post('/users', async (req, res)=>{
    const {name, age, team} = req.body
    const saveUser = User.save({
        name,
        age,
        team
    })
    res.json(saveUser)
})
app.get('/users', async (req, res)=>{
    const users = await User.find().populate('team')
    res.json(users)
})
app.get('/users/:id', async(req, res)=>{
    const user = await User.find({_id : req.params.id}).populate('team')
    res.json(user)
})

app.patch('/users/:id', async(req, res)=>{
    const user = await User.findOneAndUpdate({_id:req.params.id},req.body,{
        returnOriginal: false
    }
)
    res.json(user)
})

app.delete('/users/:id', async(req, res)=>{
    const result = await User.deleteOne({_id: req.params.id})
    res.json(result)
})

 

728x90
반응형

댓글