Sequelize 시작하기

시퀄라이즈 시작하기

프로젝트 생성하기

시퀄라이즈란 ORM(Object-relational Mapping)의 한 종류로 분류되며 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑하는 도구이다.

시퀄라이즈에서 사용 할 수 있는 데이터베이스는 이번에 사용 할 Mysql외에도 Postgresql, MariaDB, SqliteDB 등이 있다.

이러한 시퀄라이즈를 사용하는 이유는 SQL을 알지 못하더라도 자바스크립트 문법만으로 SQL이 가능하다는 장점이 있다. 하지만 기본적인 SQL을 모르고 사용하는 것을 권장하지는 않는다.

기본적인 문법은 알아야 시퀄라이즈 사용에 큰어려움이 없다.

시퀄라이즈 시작하기

프로젝트 생성하기

1
npm init

프로젝트를 생성한 후 시퀄라이즈 사용에 필요한 패키지들을 install 해준다.
npm i mysql2 sequelize sequelize-cli
3가지 모듈과 뷰 화면에 필요한 템플릿 엔진 및 각 환경에 맞게 사용해주면 된다.

시퀄라이즈 생성
터미널에 npx sequelize init을 입력한다.
이 후 폴더 구조를 살펴보면 config, models, migrations, seeders 폴더가 프로젝트 폴더에 추가 된 것을 확인 할 수 있다. 기본적인 설정은 여기까지다.

express 시퀄라이즈 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');

const { sequelize } = require('./models');

const app = express();
app.set('port', process.env.PORT || 3001);

...

sequelize.sync({ force: false }) // force: false 실행시마다 테이블을 새로 재생성할건가에 대한 옵션 true or false
.then(() => {
console.log('데이터베이스 연결 성공!');
})
.catch((err) => {
console.log(err);
});
...

sync 메서드를 사용하여 express서버와 시퀄라이즈를 연결해주면 된다. force옵션은 boolean타입으로 적어주면 되는데 true설정시 기존의 데이터베이스의 모든 데이터와 테이블을 삭제 후 다시 생성하는 옵션이므로
상황에 맞게 잘 선택해서 사용해야한다. 👈 잘못하면 데이터가 다 날아가 버리는 그런 일이 일어날 수 있다...

config.json 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"development": {
"username": "유저이름",
"password": "비밀번호",
"database": "데이터베이스",
"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파일을 수정하여 데이터베이스 정보와 유저 정보를 입력하고 서버를 실행한다.

1
2
3
[nodemon] starting `node app.js`
3001 번 포트에서 대기중
데이터베이스 연결 성공!

연결 성공시 설정한 로그가 출력되면 연결이 성공 한 것이다. 연결이 실패하면 error로그를 출력된다.

모델 정의하기
시퀄라이즈는 데이터베이스의 테이블과 대응되는 관계이며 모델과 테이블을 연결해주는 역할을 하는 기능을 가지고 있다. 따라서 데이터베이스에서 사용할 테이블을 시퀄라이즈에서 정의 해주어야 한다.
또한 시퀄라이즈에서는 모델 이름은 단수형 테이블 이름은 복수형으로 네이밍을 하는 암묵적인 규칙이 있다고 한다..

User 모델정의

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init({
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
},
age: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
},
married: {
type: Sequelize.BOOLEAN,
allowNull: false,
},
comment: {
type: Sequelize.TEXT,
allowNull: true,
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
sequelize,
timestamps: false,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: false,
charset: 'utf8',
coolate: 'utf8_general_ci',
});
}
static associate(db) {}
};

모델은 확장 클래스로 정의를 한다. 모델정의는 static init과 associate 두가지로 구분되며 위의 코드를 보면 init 메서드에서는 테이블에대한 설정을 하고 associate 메서드는 비워진 것을 확인 할 수 있다.
associate 메서드는 테이블간의 관계를 맺을 때 사용하는 메서드로 사용한다.

init 메서드 첫 번째 인수
첫 번재 인수로 전달하는 값은 컬럼을 설정하는 값들이다. 이곳에 컬럼명과 자료형을 입력하면 되는데 STRING와 같이 mysql이나 데이터베이스에서 사용하는 자료형과는 조금 다른 형식으로 입력을 하는 것을 볼 수 있다. 이는 시퀄라이즈와 데이터베이스 자료형의 비교를 해보며 작성하면 된다.

init 메서드 두 번째 인수
두 번째 인수로 전달하는 값은 테이블의 옵션을 설정하는 값들을 작성한다. 테이블의 옵션들을 살펴보면 다음과 같다.

  1. sequelize: static init의 매개변수와 연결되는 옵션이다.
  2. timestamps: 값이 true면 시퀄라이즈는 createdAt과 updatedAt 컬럼을 추가해준다, 각각의 로우가 생성될 때와 수정될 때의 시간이 자동으로 입력된다.
  3. underscored: 시퀄라이즈는 테이블명과 컬럼명을 기본적으로 생성 할 때 camel case로 만든다. 이를 snake case로 바꾸는 옵션이다.
  4. modelName: 모델 이름을 설정할 수 있다.
  5. tableName: 실제 데이터베이스의 테이블 이름이다.
  6. paranoid: true로 설정하면 deletedAt이라는 컬럼을 생성해준다. 이렇게 하면 로우를 삭제할 때 완전히 지우지 않고, deletedAt에 지운 시각이 기록된다.
  7. charset, collate: 각각 utf8 과 utf8_general_ci 로 설정해야 한글이 입력된다. 이모티콘까지 입력할 수 있게 하고 싶다면 utf8mb4 와 utf8mb4_general_ci 를 입력해주면 된다.

이렇게 생성한 모델은 서버 구동 시 데이터 베이스에 새로운 테이블을 생성한다. 다음 포스팅에서는 시퀄라이즈의 관계설정에 대해 정리하는 글을 남기도록 해야겠다.

Author

han Ju Ryeon

Posted on

2021-09-09

Updated on

2021-12-05

Licensed under

댓글