반응형
🤍시퀄라이즈란?
- MySQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리
- MySQL 이외에 MariaDB, PostgreSQL, SQLite 등등 같이 사용 가능
- 자바스크립트 구문을 알아서 SQL로 바꿔주기 때문에 편리함.
🤍시퀄라이즈 실습
1. 프로젝트 생성
2. sequelize, sequelize-cli, mysql2 패키지 설치
npm install express morgan nunjucks sequelize sequelize-cli mysql2
npm i -D nodemon
3. 시퀄라이즈를 통해 익스프레스 앱과 MySQL 연결
app.js
configure.json
4. 테이블 생성 & 모델 정의
댓글 테이블
회원 테이블
모델 정의
npm start 명령어로 실행하면 테이블이 생성되는 것을 확인할 수 있다.
5. 관계 정의하기
- 한 명의 사용자는 여러 개의 댓글을 작성할 수 있다.
- 하지만 댓글 하나에 사용자가 여러 명일 수는 없다.
- 1 (사용자) : N (댓글) 관계!!
💡시퀄라이즈에서는 1:N 관계를 hasMany 라는 메서드로 표현한다. 반대로 belongsTo 메서드도 있다. hasMany 메서드에서는 sourceKey 속성에 id를 넣고, belongsTo 메서드에서는 targetKey 속성에 id를 넣는다.
//1:N 관계 - hasMany
static associate(db) {
db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' });
}
static associate(db){
db.User.hasMany(db.Comment, {foreignKey: 'commenter', sourceKey: 'id'});
}
🤍시퀄라이즈 쿼리
- INSERT : create 메서드 사용. 한 가지 주의할 점은 데이터 삽입 시 MySQL의 자료형이 아니라 시퀄라이즈 모델에 정의한 자료형대로 넣어야 한다.
INSERT INTO nodejs.users (name, age, married, comment) VALUES ~ //SQL문
const {User} = require('../models');
User.create({
name: '',
age: ,
married : ,
comment: ,
}); //시퀄라이즈 쿼리
- SELECT : 데이터 하나만 가져올 때는 findOne 메서드, 여러 개 가져올 때는 findAll 메서드 사용.
SELECT * FROM node.js users; //SQL문
User.findAll({}); //시퀄라이즈
- WHERE절
SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30; //SQL문
User.findAll({
attributes : ['name','age'],
where : {
}
}); //시퀄라이즈
- ODER BY : LIMIT 옵션 사용
SELECT id, name FROM users ORDER BY age DESC LIMIT 1; //SQL문
User.findAll({
attributes: ['id','name'],
order: [['age','DESC']],
limitL 1,
}); //시퀄라이즈
6. CRUD 작업하기
라우터 생성
const express = require('express');
const { Comment } = require('../models');
const router = express.Router();
router.post('/', async (req, res, next) => {
try {
const comment = await Comment.create({
commenter: req.body.id,
comment: req.body.comment,
});
console.log(comment);
res.status(201).json(comment);
} catch (err) {
console.error(err);
next(err);
}
});
router.route('/:id')
.patch(async (req, res, next) => {
try {
const result = await Comment.update({
comment: req.body.comment,
}, {
where: { id: req.params.id },
});
res.json(result);
} catch (err) {
console.error(err);
next(err);
}
})
.delete(async (req, res, next) => {
try {
const result = await Comment.destroy({ where: { id: req.params.id } });
res.json(result);
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
const express = require('express');
const User = require('../models/user');
const Comment = require('../models/comment');
const router = express.Router();
router.route('/')
.get(async (req, res, next) => {
try {
const users = await User.findAll();
res.json(users);
} catch (err) {
console.error(err);
next(err);
}
})
.post(async (req, res, next) => {
try {
const user = await User.create({
name: req.body.name,
age: req.body.age,
married: req.body.married,
});
console.log(user);
res.status(201).json(user);
} catch (err) {
console.error(err);
next(err);
}
});
router.get('/:id/comments', async (req, res, next) => {
try {
const comments = await Comment.findAll({
include: {
model: User,
where: { id: req.params.id },
},
});
console.log(comments);
res.json(comments);
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
접속 시 GET/ 라우터에서 User.findAll 메서드를 호출하므로 그에 따른 SQL문이 실행되고 아래와 같은 화면이 나온다.
사용자 이름을 누르면 사용자가 등록한 댓글이 나온다.
수정도 잘 된다.
반응형
'💻 my code archive > 📗Node.js' 카테고리의 다른 글
노드 공부 기록(10) - 익스프레스로 SNS 서비스 만들기 세팅 (0) | 2022.04.28 |
---|---|
노드 공부 기록(9) - 몽고디비 설치, 개발 환경 세팅하기 (0) | 2022.04.27 |
노드 공부 기록(7) - Node.js 자주 사용하는 미들웨어 (0) | 2022.04.22 |
노드 공부 기록(6) - Node.js fs 모듈, 파일 시스템 접근하기, 버퍼와 스트림, 폴더 생성, 삭제, 스레드풀 (0) | 2022.04.18 |
노드 공부 기록(5) - 자주 사용하는 Node.js 내장 모듈 정리 (0) | 2022.04.17 |