4번째 팀프로젝트 시작
오늘부터 팀프로젝트로 E-commerce 사이트 만들기를 시작했다.
필수 구현사항은 아래와 같다.
팀프로젝트 세팅
그동안 항상 와이어프레임은 내가 일러스트로 작업했었는데 이번에는 팀원들이랑 같이 만들어보고 싶어 draw.io를 사용하여 와이어프레임을 만들었는데 생각보다 시간이 오래걸렸다. 와이어프레임부터 ERD, API, Github 기본 repo 세팅까지 하는데 하루 종일 걸려서 다음에는 좀 더 쉽게 하기위해 sequelize 작업 중 까먹었던 부분들을 정리해봤다.
npm i sequelize mysql2 -S
npm i sequelize-cli -D
npm sequelize init
require('dotenv').config();
const env = process.env;
const development = {
username: 'root',
password: process.env.MYSQL_PASSWORD,
database: 'onlineShop_db',
host: process.env.MYSQL_HOST,
dialect: 'mysql',
};
const production = {
username: 'root',
password: null,
database: 'database_production',
host: '127.0.0.1',
dialect: 'mysql',
};
const test = {
username: 'root',
password: process.env.MYSQL_PASSWORD,
database: 'onlineShop_test_db',
host: process.env.MYSQL_HOST,
dialect: 'mysql',
};
module.exports = { development, production, test };
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.js')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf('.') !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
);
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.Sequelize = Sequelize;
module.exports = db;
MYSQL_HOST = 127.0.0.1 # rds사용하면 rds주소
MYSQL_PASSWORD = DB 비밀번호
DB 생성
npx sequelize db:create
모델 생성
npx sequelize model:generate --name User --attributes email:string,password:integer
마이그레이션 파일 생성(fk 세팅용)
npx sequelize migration:generate --name fk-setting
생성된 마이그레이션 파일에 fk추가 (fk 추가할 모든 모델 생성 완료 후)
async up(queryInterface, Sequelize) {
// Carts 테이블에 item_id 생성
await queryInterface.addColumn('Carts', 'item_id', {
type: Sequelize.BIGINT,
});
await queryInterface.addConstraint('Carts', {
fields: ['item_id'],
type: 'foreign key',
name: 'Carts_item_id_fk',
references: {
table: 'Items', // 참조할 테이블
field: 'itemId', // 참조할 필드
},
onDelete: 'cascade',
onUpdate: 'cascade',
});
// 여러개면 위 내용 아래에 여러개 작성
}
async down(queryInterface, Sequelize) {
await queryInterface.removeColumn('Carts', 'user_id');
// 여러개면 위 내용 아래에 여러개 작성
}
// models/items.js
// Items 테이블에서 Orders 테이블로 One to Many
models.Items.hasMany(models.Orders, { foreignKey: "item_id" });
// Categories 테이블에서 Items 테이블로 One to Many
models.Categories.belongsTo(models.Items, { foreignKey: "categoryId" });
npx sequelize db:migrate