-
[NodeJS] Sequelize를 이용하여 CRUD 해보기Server/NodeJS 2020. 10. 23. 00:44728x90반응형
이번 글에서는 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를 해보았다.
반응형'Server > NodeJS' 카테고리의 다른 글
[NodeJS] Passport로 카카오 로그인 구현하기 (0) 2020.10.27 [NodeJS] 몽구스(Mongoose) 사용하여 CRUD 해보기 (1) 2020.10.23 [NodeJS] Sequelize : ORM(Object-relational Mapping) 사용하기 (0) 2020.10.18 [NodeJS] KAKAO BOOK OPEN API 사용하는 법 (0) 2020.08.14 [JavaScript] async와 await란? (1) 2020.06.25