노드 공부 기록(8) - 시퀄라이즈 사용하기
my code archive
article thumbnail
반응형

🤍시퀄라이즈란?

  • 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문이 실행되고 아래와 같은 화면이 나온다.

사용자 이름을 누르면 사용자가 등록한 댓글이 나온다.

수정도 잘 된다.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형