logo

JEONGGON

    블로그
github
mode
목 차
down-arrow

MongoDB Mongoose CRUD

2024.04.09.

post-thumbnail

Mongoose CRUD

1. Schema, Model 생성하기

1-1. models 파일 생성

  • models/products.model.js, models/users.model.js 의 디렉토리(models)와 파일 생성

1-2. 스키마 생성

// models/products.model.js

const { default: mongoose } = require("mongoose");

// 스키마 생성
const productSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  price: {
    type: Number
  }
});

1-3. 모델 생성

// models/products.model.js

const { default: mongoose } = require("mongoose");

const productSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  price: {
    type: Number
  }
});

// 모델 생성 및 내보내기
const Product = mongoose.model("Product", productSchema);

module.exports = Product;


2. CRUD 구현

2-1. controllers 파일 생성

  • controllers/products.controller.js의 디렉토리(controllers)와 파일 생성

2-2. Create

  • 모델의 create() 메서드 활용하기
// create 예시

// controllers.products.controller.js

const productModel = require('../models/products.model');

async function createProduct(req, res, next) {
  try {
    const createProduct = await productModel.create(req.body);
    res.status(201).json(createProduct);
  } catch (error) {
    next(error);
  }
};

module.exports = { createProduct };
  • create 성공 status 코드는 201 임
  • 코드 내부에 있는 두 개의 createProduct은 서로 다른 변수임을 주의
  • 함수 createProduct는 새로운 상품을 생성하는 역할
  • try문 안의 createProduct 상수는 productModel.create() 함수의 결과를 저장

- Create 라우트

  • routes/products.router.js의 디렉토리(routes)와 파일 생성
// 라우터 예시

// routes/products.router.js

// express, controller 가져오기
const express = require('express');
const productsController = require('../controllers/products.controller');

// 라우터 생성
const productsRouter = express.Router();

// 라우터와 controller 연결
// 해당 url로 요청(get, post, put, delete)이 오면 controller 실행
// create는 post 요청
productsRouter.post('/', productsController.createProduct);

// 라우터 내보내기
module.exports = productsRouter;
// server.js

const productsRouter = require("./routes/products.router");

// 엔트리 포인트 설정
app.use('/products', productsRouter);

- Create 요청 테스트

  • postman에서 해당 포트로 요청 보내기
  • POST 메서드, URL은 http://localhost:3000/products, Body에 name, description, price 데이터 기입 후, 요청 보내기
  • 응답으로 생성된 document의 JSON 데이터를 받음

postman으로 create 요청
postman으로 create 요청


MongoDB collections 데이터 확인
MongoDB Collections 데이터 확인


2-3. Read

  • 조회의 경우, 전체 documents 조회, 특정 documents 조회와 같이 크게 2가지로 나눠 볼 수 있음
  • 전체 조회는 find() 메서드에 {} 넣기
  • 특정 아이디 조회는 findById() 메서드에 url에서 전달된 id 담아 보내기
// read 예시

// controllers.products.controller.js

const productModel = require('../models/products.model');

// 전체 product document 조회
async function getProducts(req, res, next) {
  try {
    const allProducts = await productModel.find({});
    res.status(200).json(allProducts);
  } catch (error) {
    next(error);
  }
};

// 특정 productId의 product document 조회
// '/product/:productId' req에서 params로 productId를 가져와 사용
async function getProductById(req, res, next) {
  try {
    const product = await productModel.findById(req.params.productId);
    // 해당 아이디의 product가 있으면 데이터 전송
    if (product) {
      res.status(200).json(product);
      // product가 없으면 404 메시지 전송
    } else {
      res.status(404).send();
    }
  } catch (error) {
    next(error);
  }
};

module.exports = { getProducts, getProductById };

- Read 라우트

// routes/products.router.js

const express = require('express');
const productsController = require('../controllers/products.controller');

const productsRouter = express.Router();

// read는 get 메서드를 사용
productsRouter.get('/', productsController.getProducts);
productsRouter.get('/:productId', productsController.getProductById);

module.exports = productsRouter;

- Read 요청 테스트

  • postman으로 get 요청 보내서 데이터 응답 확인하기

postman으로 전체 데이터 read 요청
postman으로 전체 데이터 read 요청


postman으로 특정 아이디 데이터 read 요청
postman으로 특정 아이디 데이터 read 요청


2-4. Update

  • findByIdAndUpdate() 메서드 사용해서 업데이트 할 수 있음
  • 업데이트 적용된 후, document를 응답으로 반환하려면 new 옵션을 true로 설정해야함
// update 예시

// controllers.products.controller.js

const productModel = require('../models/products.model');

async function updateProduct(req, res, next) {
  try {
    let updatedProduct = await productModel.findByIdAndUpdate(
      req, params.productId,
      req.body,
      { new: true }
    );
    if (updatedProduct) {
      res.status(200).json(updatedProduct);
    } else {
      res.send(404).send();
    }
  } catch (error) {
    next(error);
  }
};

module.exports = { updateProduct };

- Update 라우트

const express = require('express');
const productsController = require('../controllers/products.controller');

const productsRouter = express.Router();

// read는 put 메서드를 사용
productsRouter.put('/:productId', productsController.updateProduct);

module.exports = productsRouter;

- Update 요청 테스트

postman으로 특정 아이디 데이터 update 요청
postman으로 특정 아이디 데이터 update 요청


2-5. Delete

  • findByIdAndDelete() 메서드 사용하여 삭제 할 수 있음
// delete 예시

const productModel = require('../models/products.model');

async function deleteProduct(req, res, next) {
  try {
    let deletedProduct = await productModel.findByIdAndDelete(req, params.productId);
    if (deletedProduct) {
      res.status(200).json(deletedProduct);
    } else {
      res.send(404).send();
    }
  } catch (error) {
    next(error);
  }
};

module.exports = { deleteProduct };

- Delete 라우트

const express = require('express');
const productsController = require('../controllers/products.controller');

const productsRouter = express.Router();

// delete는 delete 메서드를 사용
productsRouter.delete('/:productId', productsController.deleteProduct);

module.exports = productsRouter;

- Delete 요청 테스트

postman으로 특정 아이디 데이터 delete 요청
postman으로 특정 아이디 데이터 delete 요청


MongoDB delete 요청 결과
MongoDB Collection 2개에서 delete 요청 후, 1개의 데이터만 남음

mongodbdatabasenosqlmongooseODMlibraryCRUD
profile

조정곤

주니어 프론트엔드 개발자

github
linkedin
instagram
email

< 이전글

MongoDB Mongoose

다음글 >

Vite Create-React-App과 비교

Mongodb 포스트 (4)

down-arrow
MongoDB 소개MongoDB 사용MongoDB MongooseMongoDB Mongoose CRUD