Sequelize model 정의
sequelize model 정의
- sesquelize model 을 정의하는 방법은 여러가지 있지만, sequelize 의
define
메소드를 이용해 정의하고자 한다. - model이란 데이터베이스의 테이블에 해당되며, 객체내의 key 값은 컬럼으로 생성된다.
1
2
3
4
5
6
7
8
9
10
11return sequelize.define(
"User",
{
username: {
type: DataTypes.STRING(128)
},
job: {
type: DataTypes.STRING
}
}
)
define
함수의 첫번째 파라미터는 테이블의 이름에 해당된다. 또한 express 프로젝트에서도 해당 이름으로 데이터베이스에 접근할 수 있다.- 두번째 파라미터는 컬럼을 정의하는 것이다. 위의 예시는 가장 기본적인 컬럼을 생성한 것이고 나머지 옵션들은 밑에서 확인해 보도록 한다.
column option
- sequelize model 생성시 sequelize 는 고유 키값을 정의해 주지 않아도, 다른 설정이 없다면 id 로 생성해주며 row 생성시 자동으로 1씩 증가한다.
- id 이외에 createdAt(생성일), updatedAt(수정일) 도 같이 생성해준다.
- defaultValue: row가 생성될때 기본값을 설정해줄 수 있다. (etc. Sequelize.NOW)
- allowNull: false로 설정해주면 빈값으로 생성시 에러가 난다.(default true)
- unique: 테이블내의 고유한 값(boolean)
- primaryKey: 고유 키값 설정 여부
- autoIncrement: 자동으로 값을 증가시켜준다. (Integer 에서만 사용 가능)
- field: 객체 키값과 다르게 custom으로 컬럼명을 사용할 수 있게해준다.
- comment: 해당 컬럼에 대한 설명을 달 수 있다. 컬럼 생성에 영향을 미치지는 않는다. 주석같은 개념
Getters & setters
- 컬럼 option에 getter와 setter를 추가해 줄 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26return sequelize.define(
"User",
{
username: {
type: DataTypes.STRING(128),
allowNull: false,
get() {
const job = this.getDataValue('job')
return `${this.getDataValue('username')} (${this.getDataValue('job')})`
}
},
job: {
type: DataTypes.STRING,
allowNull: false,
set(job) {
this.setDataValue('job', job.toUpperCase())
}
}
}
)
const userSample = async () => {
const user = await User.create({ username: 'kkangil', job: 'developer' })
console.log(user.get('username')) // kkangil (DEVELOPER)
console.log(user.get('job')) // DEVELOPER
} getDataValue
를 사용하여 자신의 컬럼 뿐만 아니라 테이블의 컬럼 데이터도 가져올 수 있다.setDataValue
를 사용하여 생성이나 수정 시 데이터 값을 수정, 변경할 수 있다.- 컬럼 객체 내부에 설정해 주지 않고,
define
함수의 세번째 파라미터로도 사용이 가능하다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19return sequelize.define(
"User",
{
username: {
type: DataTypes.STRING(128),
allowNull: false
},
job: {
type: DataTypes.STRING,
allowNull: false
}
}, {
getterMethods: {
getUser() {
return `${this.username} (${this.job})`
}
}
}
)
validate column
데이터 타입 이외에도
validate
를 사용해서 유효성 확인 후 에러를 반환해 줄 수 있다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26return sequelize.define(
"Foo",
{
bar: {
type: DataTypes.STRING,
validate: {
is: /^[a-z]+$/i, // 정규식 사용해서 유효성 확인
not: /^[a-z]+$/i,
isEmail: true, // 이메일 유효성 확인
isInt: true,
notNull: true,
isNull: true,
notEmpty: true, // string 빈값 확인
equals: 'specific value', // 특정 값으로만 생성 가능
contains: 'foo', // 해당 값을 포함하고 있는지 확인
notContains: 'bar',
notIn: [['foo', 'bar']],
isIn: [['foo', 'bar']],
len: [2,10], // 2자리 ~ 10자리
max: 23,
min: 10,
isCreditCard: true // 신용카드 유효성 확인
}
}
}
)제공되는
validate
가 아닌 직접 만들어서 사용하는 기능도 제공한다.1
2
3
4
5
6
7
8
9
10bar: {
type: DataTypes.INTEGER,
validate: {
isEven(value) {
if (parseInt(value) % 2 !== 0) {
throw new Error('Only even values are allowed!');
}
}
}
}- throw new Error의 메시지가 에러로 리턴된다.
- 직접 만들어서 사용하지 않아도 메시지를 설정해 줄 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12bar: {
type: DataTypes.INTEGER,
validate: {
notNull: {
msg: "Must"
},
isIn: {
args: [['en', 'zh']],
msg: "Must be English or Chinese"
}
}
} allowNull
을 사용한다면notNull
의msg
를 설정해주면 에러메시지로 사용가능하다.
1 | return sequelize.define( |
define
함수의 세번째 파라미터 객체에 validate 를 설정해주면 하나의 컬럼이 아닌 테이블의 모든 컬럼의 유효성은 같이 확인 할 수 있다.
model configuration
define
함수의 세번째 파라미터 객체의 설정값1
2
3
4
5
6
7
8
9
10
11
12return sequelize.define(
..., {
modelName: 'bar', // 모델 이름 설정
timestamps: false, // createdAt, updatedAt 생성하지 않음
paranoid: true, // 데이터를 삭제하지 않고 현재 시간으로 deletedAt 데이터가 추가된다.
underscored: true, // 자동으로 컬럼명을 snake 네임으로 변경한다.
tableName: 'my_bar', // 테이블 이름 설정
createdAt: false, // createdAt 사용하지 않음
updatedAt: 'updateTimestamp', // updatedAt 컬럼명 정의
deletedAt: 'destroyTime', // deletedAt 컬럼명 정의 (paranoid가 true로 설정되어 있어야함.)
}
)