ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NodeJS] Sequelize를 이용하여 CRUD 해보기
    Server/NodeJS 2020. 10. 23. 00:44
    728x90
    반응형

    이번 글에서는 Sequelize를 이용해서 간단히 유저, 댓글의 CRUD(Create: 생성, Read: 읽기, Update: 갱신, Delete: 삭제)를 해보려 한다.

     

    Sequelize 기본 세팅

    여기에서 Sequelize의 기본적인 개념과 세팅을 한 후에 이 글을 읽으면 좋을 것 같다. 

     

     Express 프로젝트 구조는 위와 같다. 그리고 routes 패키지 아래에 comment.js를 추가 하자.

     

    index.js

    const express = require('express');
    const router = express.Router();
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
    });
    
    router.use('/users', require('./users'));
    router.use('/comment', require('./comment'));
    
    module.exports = router;

    그리고 index.js에서 users, comment의 router를 연결시키자. 

     

    model.js

    const Sequelize = require('sequelize');
    
    const env = process.env.NODE_ENV || 'development';         // 개발용 환경 설정
    const config = require('../config/config.json')[env];      // Sequelize 설정 파일
    const db = {};
    
    // Sequelize 인스턴스화
    const sequelize = new Sequelize(config.database, config.username, config.password, config);  
    
    db.Sequelize = Sequelize;  // db객체에 Sequelize 패키지 넣기
    db.sequelize = sequelize;  // db객체에 Sequelize 인스턴스 넣기
    
    db.User = require('./user')(sequelize, Sequelize);
    db.Comment = require('./comment')(sequelize, Sequelize);
    
    db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id'});   // 사용자는 여러개의 댓글을 가질 수 있음
    db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' }); // 작성자가 한명임 
     
    module.exports = db;  // 모듈화

    지금 코드가 잘 이해가 가지 않는다면 위에서 Sequelize 기본세팅 글을 먼저 읽고 오면 도움이 많이 될 것 같다.

     

    users.js - 유저 API

    const express = require('express');
    const router = express.Router();
    const { User } = require('../models');  
    
    // 유저 전체 조회
    router.get('/', (req, res, next) => {
      User.findAll()
        .then((users) => {
          res.json(users);
        })
        .catch((err) => {
          console.error(err);
          next(err);
        })
    });
    
    // 유저 등록
    router.post('/', (req, res, next) => {
      User.create({
        name: req.body.name,
        age: req.body.age,
        married: req.body.married
      })
        .then((result) => {
          console.log(result);
          res.status(200).json(result);
        })
        .catch((err) => {
          console.error(err);
          next(err);
        })
    })
    
    
    module.exports = router;
    

    위에는 user를 생성하고 조회하는 코드이다. 먼저 findAll()을 이용하면 유저 전체조회를 할 수 있다. 그리고 create()를 사용하면 insert 쿼리를 사용하는 것과 같다. 실제로 잘 작동하는지 PostMan을 이용해서 테스트를 해보자.

     

     

    유저생성

    위와 같이 유저생성을 요청했을 때 200으로 잘 응답이 오는 것을 확인할 수 있다. 이번에는 DB에도 잘 들어갔는지 확인을 해보자. 

     

    위와 같이 DB에도 값이 잘 들어간 것도 확인할 수 있다. 

     

     

    유저 전체조회

    유저 전체조회를 했을 때도 방금 생성한 유저가 응답으로 요청이 잘 오는 것도 볼 수 있다.

     

     

    comment.js - 댓글 API

    const express = require('express');
    const router = express.Router();
    const { Comment, User } = require('../models');
    
    // 댓글 전체 조회
    router.get('/:id', (req, res, next) => {
      Comment.findAll({
        /**
         * include: 모델 간의 관계 연결
         * model : 어떤 모델인지 지정 
         * where: 쿼리 조건 설정 (id의 해당하는 유저가 쓴 댓글을 전체 조회)
         */
        include: {  
          model: User,
          where: { id: req.params.id },
        }
      })
        .then((comment) => {
          console.log(comment);
          res.json(comment);
        })
        .catch((err) => {
          console.error(err);
          next(err);
        })
    });
    
    // 댓글 등록
    router.post('/', (req, res, next) => {
      Comment.create({
        commenter: req.body.id, 
        comment: req.body.comment,
      })
        .then((result) => {
          console.log(result);
          res.status(200).json(result);
        })
        .catch((err) => {
          console.error(err);
          next(err);
        })
    })
    
    // 댓글 수정
    router.patch('/:id', (req, res, next) => {
      Comment.update({
        /**
         * comment : 수정한 댓글 내용
         * where: 어떤 댓글을 수정할지 ?
         */
        comment: req.body.comment,
      }, {
        where: { id: req.params.id },
      })
        .then((result) => {
          console.log(result);
          res.json(result);
        })
        .catch((err) => {
          console.error(err);
          next(err);
        })
    })
    
    // 댓글 삭제
    router.delete('/:id', (req, res, next) => {
      Comment.destroy({
        /**
         * where: 어떤 댓글을 수정할지 ?
         */
        where: { id: req.params.id },
      })
        .then((result) => {
          console.log(result);
          res.json(result);
        })
        .catch((err) => {
          console.log(err);
          next(err);
        })
    })
    
    module.exports = router;
    

    위와 같이 댓글의 생성, 조회, 삭제, 갱신의 API를 만들었다. 이제 하나씩 잘 작동하는지 테스트를 해보자.

     

    • 전체 조회 : findAll()
    • 생성 : create()
    • 갱신 : update()
    • 삭제 : destroy()

     

     

    댓글 작성

    1번 유저가 댓글을 작성했을 때 잘 작성이 되어 200으로 응답이 오는 것도 확인할 수 있다.

     

     

    1번 유저가 쓴 댓글 전체조회

    아까 테스트 김에 댓글을 하나 작성한 것이 있어서 방금 작성한 것까지 총 2개가 잘 나오는 것도 확인할 수 있다.

     

    나머지 삭제, 갱신도 API Uri에 맞게 PostMan으로 테스트를 해보면 올바르게 응답이 오는 것을 볼 수 있다. 이렇게 Sequelize를 이용해서 간단한 CRUD를 해보았다.  

    반응형

    댓글

Designed by Tistory.