Node.js/sequelize
sequelize
honey.kikiki
2021. 11. 26. 22:47
728x90
sequelize란?
sequelize란 nodeJS에서 mysql을 사용할 때 raw Query문을 사용하지 않고 더욱 쉽게 다룰 수 있도록 도와주는 라이브러리이다. sequelize는 ORM(Object-Relational Mapping)로 분류가 됩니다.
ORM이란 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다.
sequelize를 사용하면 raw Query문을 사용하지 않고 자바스크립트를 이용해서 mysql을 사용할 수 있다.
sequelize 설치
npm i sequelize // 시퀄라이즈 설치
npm i mysql2 // mysql2 설치
npm i sequelize-cli // sequelize-cli 설치
설치후 sequelize init
시퀄라이즈 기본 세팅이 완료된다.
sequelize 세팅하기
config.json
{
"development": {
"username": "root",
"password": null
"database": "database_development",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
config.json 세팅
비밀번호와 테이터 베이스 이름을 정한후
npx sequelize db:create
mysql에 DB를 생성해준다
models 폴더의 index.js 파일을 새로 커스텀 해준다.
models/index.js
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const User = require('./user');
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config,
);
db.sequelize = sequelize;
db.User = User;
User.init(sequelize);
// User.associate(db); 관계설정
module.exports = db;
sequlize 모델 파일을 설정하고
테이블을 만들어준다.
models/user.js
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
name: {
type: Sequelize.STRING(20),
allowNull: false,
},
temperature: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
},
score: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
defaultValue: 100,
},
},
{
sequelize,
timestamps: true,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: true,
charset: 'utf8',
collate: 'utf8_general_ci',
},
);
}
static associations(db) {}
};
모델 옵션 정리
Mysql | 시퀄라이즈 | |
가변길이 문자형. 문자수가 최대 n개인 문자열. 공백 X | VARCHAR(100) | STRING(100) |
문자수가 최대 65535개인 문자열 | TEXT |
TEXT
|
약 -21억 ~ 21억의 정수 | INT | INTEGER |
실수 사용가능 |
FLOAT
|
FLOAT
|
아주 작은 범위의 정수 (-128~127) | TINYINT | BOOLEAN |
년, 월, 일, 시, 분, 초. 'YYYY-MM-DD HH:MM:SS' 형식으로 사용 | DATEETIME | DATE |
0과 양수만 허용 | INT UNSIGNED | INTEGER.UNSIGNED |
특정 컬럼에 NULL 값이 들어갈 수 없도록 한다. 공백(' ')이나 0 같은 값과는 다르다. |
NOT NULL | allowNull:false |
특정 컬럼의 값은 테이블 내에서 유일해야 한다. PRIMARY KEY와 차이점은 NULL 값을 허용한다. |
UNIQUE | unique: true |
값을 입력하지 않았을 때, 자동으로 입력되는 기본값을 정의한다. | DEFAULT now() | deafaultValue: Sequelize.NOW |
테이블 옵션
true면 createdAt(생성시간) , updatedAt(수정시간) 자동으로 만듬 | timestamps: true |
true면 deletedAt(삭제시간) 컬럼을 만듬, 로우복구를 위해 완전히 삭제하지 않는다 | paranoid |
옵션은 카멜케이스 로 생성되는 컬럼을 스테이크케이스로 생성 | underscored |
모델의 이름 | modelName |
테이블 이름 | tavleName |
한글 설정을 위해 필요(이모티콘 넣으려면 (utf8mb4) | charset , collate : utf8 or utf8mb4 |
app.js
sequelize 세팅
const { sequelize } = require('./models');
sequelize
.sync({ force: false })
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});
모델 동기화
모델을 정의할 때 Sequelize에게 데이터베이스의 테이블에 대한 몇 가지 정보를 알려줍니다. 그러나 테이블이 실제로 데이터베이스에 존재하지 않는다면 어떻게 될까요? 존재하지만 열이 다르거나 열이 적거나 다른 차이점이 있으면 어떻게 합니까?
여기서 모델 동기화가 시작됩니다. model.sync(options)Promise를 반환하는 비동기 함수인 를 호출하여 모델을 데이터베이스와 동기화할 수 있습니다 . 이 호출을 통해 Sequelize는 데이터베이스에 대한 SQL 쿼리를 자동으로 수행합니다. 이것은 JavaScript 측의 모델이 아니라 데이터베이스의 테이블만 변경합니다.
- User.sync() - 존재하지 않는 경우 테이블을 생성합니다(이미 존재하는 경우 아무 작업도 수행하지 않음).
- User.sync({ force: true }) - 이것은 테이블을 생성하고 이미 존재하는 경우 먼저 삭제합니다.
- User.sync({ alter: true }) - 데이터베이스에 있는 테이블의 현재 상태(열이 있는 열, 데이터 유형이 무엇인지 등)를 확인한 다음 테이블에서 필요한 변경을 수행하여 모델과 일치하도록 합니다.
npm start 하면 테이블이 만들어진다. (package.json을 세팅해두기)