[포스코x코딩온] Sequelize 사용하기
Sequelize
- JS구문을 알아서 SQL로 변환해준다.
- DB 작업을 쉽게 할 수 있도록 도와주는 ORM(Object-Relational Mapping) 라이브러리 중 하나
- https://sequelize.org/api/v6/identifiers.html
Reference | Sequelize
V Deferrable: {"INITIALLY_DEFERRED": *, "INITIALLY_IMMEDIATE": *, "NOT": *, "SET_DEFERRED": *, "SET_IMMEDIATE": *}
sequelize.org
주요 기능 및 개념
- 모델 정의: Sequelize를 사용하면 JavaScript 클래스 형태로 데이터베이스 테이블을 모델링할 수 있다. 이 모델 클래스는 데이터베이스 테이블과 1:1 매핑되며, 모델 클래스의 인스턴스는 데이터베이스 레코드를 나타낸다.
- 마이그레이션: 데이터베이스 스키마를 변경하거나 업데이트하는 것을 도와주는 기능이다. 마이그레이션을 사용하면 데이터베이스 스키마 버전 관리를 보다 편리하게 할 수 있다.
- CRUD 작업: CRUD 작업을 간단하게 수행할 수 있다.
- 검색 및 쿼리: 강력한 쿼리 빌더를 제공하여 복잡한 쿼리 작성을 지원한다. 데이터베이스에서 데이터를 검색하고 필터링하는 작업을 쉽게 할 수 있다.
- 관계 정의: 데이터베이스 테이블 간의 관계를 모델링할 수 있다. 1:1, 1:N, N:M 등 다양한 관계를 정의하고 관계에 따라 데이터를 조회하거나 연결할 수 있다.
- 트랜잭션: 복수의 쿼리 작업을 하나의 트랜잭션으로 묶어서 원자성과 일관성을 보장할 수 있다.
Sequelize 설치
npm install sequelize sequelize-cli mysql2
- sequelize : 시쿼라이즈 패키지
- sequelize-cli : 시쿼라이즈 명령어 수행
- mysql2 : mysql과 시쿼라이즈 연결하는 드라이버(도구)
npx sequelize init
- sequelize init : 명령어 호출
※npm과 npx 비교
2023.08.09 - [개념 정리] - npm과 npx 비교
npm과 npx 비교
npm과 npx 비교 npm Node.js 패키지를 설치, 관리, 배포하는 데 사용되는 명령줄 도구. 패키지 설치: 'npm install ' 명령을 사용하여 패키지를 설치한다. 이때, 패키지는 'package.json' 파일에 기록되고 의존
dongho-kang.tistory.com
Sequelize 모델 정의
MySQL에서 정의한 테이블을 Sequelize에서도 정의가 필요하다.
즉, MySQL 테이블과 Sequelize의 모델이 대응한다.
Sequelize.define(param1, param2, param3);
- param1 : 모델(테이블) 이름 설정
- param2 : 컬럼 정의
- param3 : 모델 옵션 정의
const model = sequelize.define(
"visitor",
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
name: {
type: DataTypes.STRING(10),
allowNull: false,
},
comment: {
type: DataTypes.TEXT("medium"),
},
},
{
tableName: "visitor",
freezeTableName: true,
timestamps: false,
}
);
- param1(첫번째 인자) => 'visitor'로 모델 이름을 설정한다.
- param2(두번째 인자) => {id ~ comment}로 컬럼을 정의한다.
- type : 데이터 타입을 정의(문자, 숫자, 날짜 등등)
- primaryKey : 기본키 설정(default: false)
- autoIncrement : 숫자 자동 증가(default: false)
- allowNull : NOT NULL 허용 여부(default: true)
- comment : column에 대한 설명 작성
- validate : 데이터 유효성 검사를 하는 속성
- param3(세번째 인자) => {tableName ~ timestamps}로 모델 옵션을 정의한다.
- charset : "utf8"
- collate : "utf8_general_ci" (만약 여기서 설정을 안하면 DB를 생성할 때 설정해야 한다.)
- tableName : 테이블 이름 설정
- freezeTableName : true로 설정하면 이름을 복수로 설정하지 않는다.
- timestamps : 기본적인 설정은 true
※
Sequelize 자료형(DataTypes) | MySQL 자료형 |
Sequelize.STRING | VARCHAR(255) |
Sequelize.STRING(1234) | VARCHAR(1234) |
Sequelize.TEXT | TEXT |
Sequelize.TEXT('tiny') | TINYTEXT |
Sequelize.INTEGER | INTEGER |
Sequelize.DATE | DATETIME for mysql |
Sequelize 쿼리문
Sequelize에서 SQL문에 상응하는 메서드가 존재
프로미스를 반환해서 .then()을 붙여서 결과값 사용이 가능하다.
- findAll() - select
- findOne() - select
- create() - insert
- update() - update
- destroy() - delete
자! 그러면 아래 글에서 만든 회원관리를 Sequelize를 사용하면서 코드를 익혀보겠습니다.
[포스코x코딩온] MySQL과 연동하고 MVC 패턴을 적용하여 회원가입, 로그인, 회원정보 수정 및 탈퇴
MySQL과 연동하고 MVC 패턴을 적용하여 회원가입, 로그인, 회원정보 수정 및 탈퇴 기능구현 Node.js, Express 모듈, ejs, MySQL을 사용하기 위한 설정 git bash에 아래 명령어들을 입력해 준다. npm init -y npm ins
dongho-kang.tistory.com
Sequelize 설치하기.
config.json
- MySQL 경로 설정하기
models/index.js
- model이 아닌 models을 사용할 것이니 여기에 있는 index.js에 기본 설정을 해준다.
"use strict";
//기본 설정
const Sequelize = require("sequelize");
const config = require(__dirname + "/../config/config.json")["development"];
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
//여기까지가 기본 설정.
models/login_sequelize.js
- Sequelize 모델 정의하기
- login_sequelize라는 테이블 만들기
const Login_sequelize = (sequelize, DataTypes) => {
const login = sequelize.define("login_sequelize", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
userid: {
type: DataTypes.STRING(20),
allowNull: false,
},
name: {
type: DataTypes.STRING(10),
allowNull: false,
},
pw: {
type: DataTypes.STRING(20),
allowNull: false,
},
});
return login;
};
module.exports = Login_sequelize;
models/index.js
- models/login_sequelize.js에서 설정한 모델을 가져오기
//모델 가져오기
db.Login_sequelize = require("./login_sequelize")(sequelize, Sequelize);
app.js
- models/index.js 가져오기
const db = require("./models/index");
db.sequelize.sync({ force: false }).then(() => {
//force: false => 테이블이 없으면 생성
//force: true => 테이블 무조건 생성(만약 DB가 있다면 다 삭제하고 다시 생성)
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
});
여기까지 Sequelize를 사용하기 위한 기본 설정이었습니다. 이제 Controller에서 직접적으로 사용을 하면 됩니다.
회원가입 기능
controller/Cuser.js
- models/index을 가져온다.
exports.postSignUp = (req, res) => {
console.log("회원가입 Brower 데이터 받아옴req1: ", req.body);
User.postSignUp(req.body, (result) => {
console.log("회원가입 정보3: ", req.body);
res.send({ result: result, msg: "회원가입 완료" });
});
};
이 코드에 Sequelize를 적용한다.
exports.postSignUp = (req, res) => {
console.log("회원가입 Brower 데이터 받아옴req1: ", req.body);
model.Login_sequelize.create({
userid: req.body.userId,
name: req.body.name,
pw: req.body.pw,
}).then((result) => {
console.log(result);
res.send({ result: result, msg: "회원가입 완료" });
});
};
코드를 이렇게 작성하면 된다. create()안에는 객체 형태로 넣어주어야 한다.
이후 실행해 보면 MySQL에 login_sequelize 테이블이 생성되고 회원가입 시 데이터도 잘 들어가는 것을 확인할 수 있다.
※ Sequelize 사용 순서
1. sequelize 초기 설정
2. config/config.json에서 MySQL 연결
3. models/index.js에서 기본 설정
4. models/에 파일 만들어서 모델 설정
5. models/index.js에서 모델 설정한 것 가져오기
6. index.js에서 models/index.js 가져오기
7. db.sequelize.sync({ force: false }).then(() => { app.listen(PORT, () => { console.log(`http://localhost:${PORT}`); }); }); 설정
8. Controller에서 작업하기.(models 불러와서)
※ update() 사용 주의
- 구조분해 할당을 사용하여 코드를 간결하게 할 수 있다.
- update는 set과 where이 있기에 아래처럼 사용하면 된다.
const { userid, pw, name, id } = req.body;
//구조분해 할당
models.User2.update(
/*set*/ { userid, pw, name },
/*where*/ {
where: {
id,
},
}
).then((result) => {
console.log("result", result);
res.send({ result: true });
});
※ findAll() 정리
//findall 정리. => 무조건 배열이다.
exports.findall = (req, res) => {
models.User2.findAll({
//attributes: 원하는 컬럼 조회
attributes: ["name", "userid"],
//Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.ne(같지않은)
//Op.or(또는), Op.in(배열 요소 중 하나), Op.notIn(배열요소와 모두다름)
where: { id: { [Op.gte]: 4 } },
//id값을 desc로 가져온다.
order: [["id", "DESC"]],
limit: 1,
offset: 1,
}).then((result) => {
//console.log("result", result);
res.send(result);
});
};
Sequelize를 사용함으로써 SQL문을 직접적으로 작성하지 않아도 된다.