- 시퀄라이즈는 MySQL, MariaDB, SQLite and Microsoft SQL Server 를 지원하는 Node.js ORM 이다.
- ORM(Object-Relational Mapping)은 관계형 데이터베이스에 있는 엔티티를 자바스크립트에 있는 객체나 클래스처럼 이용할 수 있게 만들어 주는 것이다.
- 왜 사용하는지?
- 데이터베이스의 자료를 컴퓨터 프로그래밍 적인 언어의 관점에서 맞출 수 있도록 해주기 위함이다.
- 시퀄라이즈 모델 생성
- sequelize.difine 함수를 통해서 만들 수 있다.
- 예제 코드
module.exports = (sequelize, DataTypes) => {
const Users = sequelize.define("Users", {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
comment: "고유번호 UUID",
},
email: {
type: DataTypes.STRING(100),
validate: {
isEmail: true,
},
comment: "이메일",
},
password: {
type: DataTypes.STRING(60),
comment: "비밀번호",
},
name: {
type: DataTypes.STRING(100),
comment: "이름",
},
phone: {
type: DataTypes.STRING(72),
comment: "전화번호",
},
}, {
charset: "utf8", // 한국어 설정
collate: "utf8_general_ci", // 한국어 설정
tableName: "Users", // 테이블 이름
timestamps: true, // createAt & updateAt 활성화
paranoid: true, // timestamps 가 활성화 되어야 사용 가능 > deleteAt 옵션 on
});
return Users;
};
- 시퀄라이즈는 3가지 파라미터 값이 들어간다.
- 모델 이름
- 컬럼 정의
- 모델 옵션 정의
- 모델 이름
- 시퀄라이즈는 모델 이름을 추론한다.
- 무슨말이나면 User로 명명해도 users로 생성한다는 뜻이다.
- 테이블 이름 옵션(tableName : "User") 또는 복수화 중지(freezeTableName : true) 옵션을 설정하지 않았다면 시퀄 라이즈는테이블 이름을 users라고 지정되어 생성된다.
- 컬럼 정의 방법
type : 데이터 타입을 정의(문자, 숫자, 날짜 등등)
primaryKey : 기본 키 설정(default : false) 시퀄 라이즈에서는 기본적으로 primaryKey 컬럼을 생성한다.(id라는 이름으로 생성)
autoIncrement : 숫자 자동 증가(default : false)
allowNull : NOT NULL 허용 여부(default : true)
unique : Unigue 조건인지 아닌지에 대한 옵션
comment : column에 대한 설명 작성 가능
validate : 데이터 유효성 검사를 하는 속성
MySQL 기준 타입은 아래와 같다.
MySQL | 시퀄라이즈 |
VARCHAR(100) | STRING(100) |
INT | INTEGER |
TINYINT | BOOLEAN |
DATETIME | DATE |
INT UNSIGNED | INTEGER.UNSIGNED |
NOT NULL | allowNull: false |
UNIQUE | unique: true |
DEFAULT now() | defaultValue: Sequelize.NOW |
ZEROFILL | INTEGER.ZEROFILL |
- 모델 옵션 정의 방법
- charset : "utf8" // charset & collate를 둘 다 설정해야 한글이 입력된다.
- collate : "utf8_general_ci" // 여기서 설정을 안 했다면 DB를 생성할 때 설정해 주면 된다
- tableName : 테이블 이름 설정
- freezeTableName : true로 설정하면 이름을 복수로 설정하지 않는다.
- timestamps : 기본적인 설정은 true 임, createdAt과 updatedAt 컬럼이 생성되며, 데이터가 생성되는 시간과 수정되는 시간을 나타내는 옵션
- 시퀄라이즈로 모델간 관계 정의
- 시퀄라이즈는 조인 기능도 구현 해준다.
- 대신 관계에 대해서 시퀄라이즈에 명시해야 한다.
- 1 : 1 , 1 : N , M : N
- 관계를 맺어주는 코드는 associate라는 함수 안에 정의하고
- hasOne, hasMany, belongsTo, belongsToMany속성으로 해당 관계 방식을 정의할 수 있다.
- - 1 : 1 관계 방식
- hasOne, belongsTo
- 1:1 관계에서는 hasMany 대신 hasOne을 사용한다.
- 1:1 관계 이더라도 hasOne과 belongsTo가 반대가 되면 안된다!
- belongsTo를 사용하는 Info 모델에 UserId 컬럼을 추가하기 때문이다.
- 1 : N 관계 방식
- hasMany, belongsTo
- 1:N 관계를 hasMany 메서드로 표현
- User 가 많은 댓글을 가질 수 있으니 hasMany가 되고 Comment는 User에 속할 수 있으니 belongsTo가 된다.
- N : M 관계 방식
- 시퀄라이즈에는 N:M 관계를 belongsToMany 메서드로 표현할 수 있다.
- 다대다 관계는 한 모델이 다른 모델과 여러 개의 관계를 가질 수 있으며, 중간 테이블을 통해 관계를 정의한다.
- ex ) 사용자와 그룹 간의 다대다 관계
// User 모델 const User = sequelize.define('User', { // 사용자 속성 정의 }); // Group 모델 const Group = sequelize.define('Group', { // 그룹 속성 정의 }); // 다대다 관계 설정 User.belongsToMany(Group, { through: 'UserGroup' }); Group.belongsToMany(User, { through: 'UserGroup' }); // 보통 associate 함수를 사용
- through 옵션을 사용하여 중간 테이블을 지정한다.
- 시퀄라이즈는 조인 기능도 구현 해준다.