본문 바로가기

Side Project

[PROJECT] Trello Clone 프로젝트 API - (2) 모델 정의

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 쪽은 문외한이여서 내가 작성한 코드도 설명하기 겁이 난다. 조금 더 열심히 해야겠다.