728x90
반응형
https://growth-coder.tistory.com/275
이전 포스팅에서 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
반응형
'공부 > express' 카테고리의 다른 글
[Express] passport 모듈을 통해 jwt 인증, 인가 구현 (1) | 2024.05.21 |
---|---|
[Express] passport 모듈을 통해 쿠키 세션 방식으로 로그인 구현 (0) | 2024.05.18 |
[Express] API 작성법 (라우터, 컨트롤러 분리) (0) | 2024.05.16 |
[Express] sequelize 사용법 (ORM) (0) | 2024.05.12 |
[express] express 웹 서버 기초 (0) | 2024.05.08 |
댓글