Trello Clone 프로젝트 API - (2) 모델 정의
서론
이번 프로젝트의 모델을 정의 해보려고 한다. 아마 개발을 하면서 수시로 바뀌겠지만 일단은 필요한 모델만 간추려서 작성해 보았다.
파일 구조
- models
- activity.js
- board.js
- card.js
- comment.js
- index.js
- list.js
- member.js
- user.js
Model
sequlize
를 이용해 정의를 하여 ( database : Mysql ).
크게 7가지의 모델로 구분해 보았다.
- activity (trello 에서 카드를 옮기는 동작이나 이벤트가 발생했을 경우 이벤트 발생한 사람과 어떤 이벤트가 발생하였는지 히스토리 형태로 저장됨 )
- board ( trello board )
- card ( trello card )
- comment ( card에 대한 comment )
- list ( trello list )
- member ( board에 속해 있는 멤버 )
- user ( user )
sequlize 사용
코드 전체를 설명할 수 없어서 부분적 코드만 설명하면
전체소스 링크
index.js
const fs = require('fs')
const path = require('path')
const basename = path.basename(__filename)
const Sequelize = require('sequelize')
const config = require('../config/db.config')
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password, {
'host': config.host,
'port': config.port,
'dialect': config.dialect
}
)
/* sequelize model define */
fs.readdirSync(__dirname).filter((file) => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js')
}).forEach((file) => {
var model = sequelize['import'](path.join(__dirname, file))
db[model.name] = model
})
Object.values(db).filter(model => model.hasOwnProperty('association'))
.forEach(model => model['association'](db))
module.exports = {
sequelize,
db
}
sequelize 공홈에 있는 코드를 그대로 사용하여 디렉토리 내에 있는 파일들을 순회하면서 db
객체에 model
들을 넣고 model
중에 association
를 가진 것들은 외래키를 설정해 주었다.
board.js
module.exports = (sequelize, DataTypes) => {
const board = sequelize.define('board', {
bid: {
field: "bid",
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
allowNull: false
},
user_id: {
field: "user_id",
type: DataTypes.UUID,
allowNull: false,
},
title: {
field: "title",
type: DataTypes.STRING(30),
allowNull: false
},
bg_type: {
field: "bg_type",
type: DataTypes.ENUM,
values: ['image', 'color'],
defaultValue: 'color',
allowNull: false
},
background: {
field: "background",
type: DataTypes.STRING(100),
defaultValue: 'rgb(0, 121, 191)',
allowNull: false
}
}, {
underscored: true,
tableName: 'board',
freezeTableName: true
})
board.association = (db) => {
db.board.belongsTo(db.user, {
foreignKey: 'user_id',
targetKey: 'uid'
})
db.board.hasMany(db.member, {
foreignKey: 'bid'
})
db.board.hasMany(db.list, {
foreignKey: 'bid'
})
db.board.hasMany(db.activity, {
foreignKey: 'bid'
})
}문외한이여서
return board
}
Primary key 는 uuid
를 사용했고, association
를 이용해 FK 처리를 했다.
ER Diagram
끝내며
server 쪽은 문외한이여서 내가 작성한 코드도 설명하기 겁이 난다. 조금 더 열심히 해야겠다.
'Side Project' 카테고리의 다른 글
[PROJECT] Trello Clone 프로젝트 API - (4) User 관련 기능 (0) | 2019.02.18 |
---|---|
[PROJECT] Trello Clone 프로젝트 API - (3) 프로젝트 구조 (0) | 2019.02.15 |
[PROJECT] Trello Clone 프로젝트 API - (1) 계획 짜기 (0) | 2019.02.11 |
[PROJECT] Trello Clone 프로젝트 시작 (2019.02.11) (1) | 2019.02.11 |
[PROJECT] jQuery-UI를 이용한 Trello clone project (6) 마무리 (0) | 2018.10.21 |