Node.js 교과서 - Sequelize ORM
시퀄라이즈 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} }],
},
});
Author And Source
이 문제에 관하여(Node.js 교과서 - Sequelize ORM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@andyjo/Node.js-교과서-Sequelize-ORM저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)