Node.js Sequelize 사용해보기 - 2
2019-09-25 18:47:14

Express에서 Sequelize ORM 사용하여 MySQL Join, Transaction 사용해보기

스키마 생성

관계를 맺기 위해 플레이어, 팀 테이블 스키마를 생성 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module.exports = (sequelize, DataTypes) => {
const players = sequelize.define('players', {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull(val) {
if (!val) {
throw new Error('선수 이름이 입력되지 않았습니다.');
}
},
},
},
position: DataTypes.STRING,
},
{
timestamps: false,
});
players.associate = (models) => { // NOTE: N : 1
players.belongsTo(models.teams);
};
return players;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module.exports = (sequelize, DataTypes) => {
const teams = sequelize.define('teams', {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
title: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull(val) {
if (!val) {
throw new Error('팀 이름이 입력되지 않았습니다.');
}
},
},
},
place: DataTypes.STRING,
},
{
timestamps: false,
});
teams.associate = (models) => { // NOTE: 1 : N
teams.hasMany(models.players);
};
return teams;
};

조인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// TODO: join 플레이어(N) : 팀(1)
router.get('/join1', (req, res) => {
db.players.findAll({
include: { model: db.teams },
}).then((result) => {
if (!result.length) return res.json({ message: 'NOT FOUND' });
return res.json(result);
}).catch((e) => res.json(e));
});

// TODO: join 팀(1): 플레이어 (N)
router.get('/join2', (req, res) => {
db.teams.findAll({
include: { model: db.players },
}).then((result) => {
if (!result.length) return res.json({ message: 'NOT FOUND' });
return res.json(result);
}).catch((e) => res.json(e));
});

join-1

join-2

트랜잭션

선수를 등록을 하는데 해당 팀이 존재하면 커밋, 업으면 롤백 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// TODO: 트랜잭션
router.post('/transaction', (req, res) => {
const { name, position, teamId } = req.body;
db.sequelize.transaction().then(async (t) => { // NOTE: 트랜잭션 시작
try {
const player = await db.players.create({ // NOTE: 선수 등록
name,
position,
teamId,
}, { transaction: t });
await db.teams.findOne({ // NOTE: 해당 팀이 잇는지 체크
where: {
id: player.teamId,
},
}, { transaction: t }); // NOTE: 트랜잭션
t.commit(); // NOTE: 팀이 잇으먼 commit (=저장)
return res.json({ message: 'create success' });
} catch (err) {
t.rollback(); // NOTE: 에러 (업는 팀)인 경우 롤백 (저장 취소)
return res.json(err);
}
}).catch((e) => res.json(e));
});

실행 결과

sql

직접 쿼리 실행도 가능 하다.

1
2
3
4
5
6
7
// TODO: sql 쿼리
router.get('/query', (req, res) => {
db.sequelize.query('select * from players').then((result) => {
console.log(result); // NOTE: 똑같은 결과가 2개 나오므로 [0]으로 처리.
return res.json(result[0]);
}).catch((e) => res.json(e));
});