Mongoose

Jae·2023년 9월 12일
0

백엔드 - Node.js

목록 보기
9/10

Mongoose

  • Node.js와 MongoDB를 위한 ODM(Object Data Mapping) library 이다.
  • 호환성이 없는 JavaScript와 MongoDB의 데이터를 Mapping하여 간편한 CRUD를 가능하게 해준다.

Connecting to MongoDB

  • 실행시킬 파일을 열어 아래와 같이 추가해준다.
 
// 추가
import mongoose from 'mongoose' 
.
.
.
mongoose.connect("mongodb://my-database:27017/mydocker")
  .then(() => console.log("db 접속에 성공하였습니다."))
  .catch(() => console.log("db 접속에 실패하였습니다."))

🌐 앱이 하나의 db만 사용하는 경우 mongoose .connect, 추가 연결이 필요한 경우 mongoose.createConnection 을 사용한다.

  • 원래는 mongoose.connect('mongodb://localhost:27017/my_database')로 연결한다. 하지만 express가 있는 docker 안에서 포트번호 27017으로 다른 mongodb가 있는 docker에 연결하는 것이 목표인데 위의 코드를 사용하면 express가 있는 docker 안에서만 포트번호 27017을 찾으려 하기 때문에 찾을 수 없다. 따라서 name resolution을 적용하여 mongoose.connect("mongodb://my-database:27017/mydocker") 코드를 위와 같이 변경한다.

Postman을 활용한 Mongoose활용

  • Model 정의를 위해 실행 파일이 있는 폴더에 model 폴더를 생성하고 폴더 안에 파일을 따로 만들어준다. ex) board.model.js
// board.model.js

import mongoose from 'mongoose'

const boardSchema = new mongoose.Schema({
    writer: String,
    title: String,
    contents: String
})

export const Board = mongoose.model("Board", boardSchema)
  • 먼저 mongoose를 import 하고 새로운 스키마를 boardSchema변수에 담아 선언하고 내부에 요소들의 key값의 타입을 지정해준다.
  • model() 메서드를 사용하여 문자열과 schema를 전달하여 model을 생성한다. 첫 번째 인자는 해당 collection의 단수적 표현을 나타내는 문자열이다.
  • 생성된 model을 외부에서 접근할 수 있도록 export 해준다.

Get 데이터 조회



import { Board } from './models/board.model.js'

const app = express()
app.use(cors())
app.use(express.json())
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerJsdoc(options)));
app.get('/boards', async (req, res) => {

  const result = await Board.find()

  // 2. 꺼내온 결과 응답 주기
  res.send(result)
})
  • 해당 Board Collection을 가져와 사용할 수 있도록 result라는 변수에 담아 응답으로 내보내 주는 코드를 추가 작성한다.
  • find는 보통 모든 데이터를 조회할 때 사용되며, findOne 은 특정 데이터만 조회할 때 자주 사용됩니다

Post 데이터 등록



app.post('/boards', async (req, res) => {
  console.log(req.body);

  // 1. 데이터를 등록하는 로직 => DB에 접속해서 데이터 저장하기
  const board = new Board({
    writer: req.body.writer,
    title: req.body.title,
    contents: req.body.contents,
  });
  await board.save();

  // 2. 저장 결과 응답 주기
  res.send('게시물 등록 성공 ');
});
  • /boards endpoint를 지정해서 POST 요청을 받았을 때 JSON 데이터를 담은 BODY에서 각각의 요소를 하나하나 빼와서 연결해 놓은 mongoDB의 boards collection에 저장해 준다.

➡️ docker를 사용해 서버를 실행시키기 때문에 docker-compose build를 입력해 docker image 생성한 후 docker-compose up을 입력해 container를 실행시킨다. 그 후 postman으로 localhost://3000/boards에 접속해 post 메서드로

//ex
{
    "writer": "철수",
    "title": "제목입니다~",
    "contents": "내용!!"
}

위와 같이 send 하면 mongoDB-compass에서도 확인 가능하다. (등록 후 postman에서 get으로 불러오기도 가능)

profile
Back-end Developer

0개의 댓글