Node.js 교과서 - Sequelize ORM

윤재·2021년 10월 10일
0

시퀄라이즈 ORM

SQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리

  • ORM: Object Relational Mapping: 객체와 데이터를 매핑(1대1 짝지음)
  • MySQL 외에도 다른 RDB(Maria, Postgre, SQlite, MSSQL)와도 호환됨
  • 자바스크립트 문법으로 데이터베이스 조작 가능

시퀄라이즈 예제는? https://github.com/zerocho/nodejs-book/tree/master/ch7/7.6/learn-sequelize/

  • 프로젝트 세팅 후, 콘솔을 통해 경로로 이동한 후 package.json 작성

시퀄라이즈 CLI 사용하기

시퀄라이즈 명령어를 사용하기 위해 sequelize-cli 설치

  • MySQL2는 MySQL DB가 아닌 드라이버(Node.js와 MySQL을 이어주는 역할)

$ npm i expres sequelize sequelize-cli mysql2
$ npm i morgan nunjucks
$ npm i -D nodemon

시퀄라이즈 구조 생성

$ npx sequelize init

모델 옵션

define 메소드의 세번째 인자는 테이블 옵션

  • timestamps: true면 createdAt, updatedAt 컬럼을 자동으로 생성
  • paranoid: true면 soft delete 후 deletedAt 생성
  • underscored: true면 컬럼명을 스네이크케이스로 생성
  • modelName, tableName: 모델명, 테이블명 설정
  • charset, collate: 한글 설정을 위해 필요, 이모티콘 넣으려면 utf8mb4


테이블 관계 이해하기

1 대 다 관계 (사용자 한명이 댓글 여러개 작성)

  • 시퀄라이즈에서는 1:N 관계를 hasMany로 표현(사용자.hasMany(댓글))
  • 반대의 입장에서는 belongsTo(댓글.belongsTo(사용자)
  • belongTo가 있는 테이블에 컬럼이 생김(댓글 테이블에 commenter 컬럼 생성)

1 대 1 관계 (사용자 테이블과 사용자 정보 테이블)

  • 1:1 관계는 hasOne으로 표현(사용자.hasOne(정보))
  • 사용자의 기본정보와 사용자의 디테일을 나누고 싶을 때.
    ex) 자주 불리는 정보는 기본정보, 가끔 조회하는 정보는 디테일
  • belongsTo는 그대로 사용, 포린키가 들어가니까 판단 잘 할 것.

다 대 다 관계(인스타그램 게시글과 해시태그 테이블)

  • 하나의 게시글의 여러개의 해시태그를 가질 수 있고 하나의 해시태그가 여러개의 개시글을 가질 수 있음
  • DB 특성 상 다대다 관계는 중간 테이블이 생김 !!
db.Post.belongsToMany(db.Hashtag, { through: 'PostHasgtag' });
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });

(일반적으로 주체적인 테이블이 다대다 관계를 맺음)


시퀄라이즈 쿼리

위 sql 쿼리문이 시퀄라이즈로 아래와 같이 바꿀 수 있다.

INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1');
const { User } = require('../models'); 
User.create({
  name: 'zero',
  age: 24,
  married: false,
  comment: '자기소개1',
}); // CREATE

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT * FROM nodejs.users;
User.findAll({}); // READ 전체

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT name, married FROM nodejs.users;
User.findAll({
  attributes: ['name', 'married'], 
}); // READ 조건

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
const { Op } = require('sequelize'); // Operator이며 gt, in, ne등 사용할때 선언
const { User } = require('../models');
User.findAll({
  attributes: ['name', 'age'],
  where: {
    married: true,
    age: {[Op.gt]: 30 },
  },
}); // where 조건으로 married, age조건 둘다 찾기, gt(greater than) = '>',

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT id, name FROM users WHERE married = 0 OR age > 30;
const { Op } = require('sequelize');
const { User } = require('../models');
User.findAll({
  attributes: ['name', 'age'],
  where: {
	[Op.or]: [{ married: false }, { age: { [Op.gt]: 30} }],
  },
});
profile
안 되면 될 때까지

0개의 댓글