[내일배움캠프] TIL_230201

JungHoon Han·2023년 2월 1일
0

내일배움캠프

목록 보기
64/78
post-thumbnail

4번째 팀프로젝트 시작

오늘부터 팀프로젝트로 E-commerce 사이트 만들기를 시작했다.
필수 구현사항은 아래와 같다.

  • Layered Architecture Pattern을 적용하기
  • Repository Layer에서 Sequelize Model을 생성자 주입(Constructor Injection)을 이용해 전달받도록 개선하기
  • 테스트코드 작성하기(unit test, integration test)
  • 이커머스 기본 기능 구현
  • 어드민 페이지(백오피스) 구현
  • 페이지네이션
  • socket.io

S.A 노션 링크

팀프로젝트 세팅

그동안 항상 와이어프레임은 내가 일러스트로 작업했었는데 이번에는 팀원들이랑 같이 만들어보고 싶어 draw.io를 사용하여 와이어프레임을 만들었는데 생각보다 시간이 오래걸렸다. 와이어프레임부터 ERD, API, Github 기본 repo 세팅까지 하는데 하루 종일 걸려서 다음에는 좀 더 쉽게 하기위해 sequelize 작업 중 까먹었던 부분들을 정리해봤다.

  • 모듈 설치
npm i sequelize mysql2 -S
npm i sequelize-cli -D
  • 사용 준비
    npm sequelize init
    1. models 폴더 안에 index.js 생성
    2. config 폴더 안에 config.json 파일 생성
    3. migrations 빈 폴더 생성
    4. seeder 빈 폴더 생성
  • config.json -> js파일로 수정 후 내용 수정
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 };
  • models/index.js 내용
'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;
  • .env 파일 추가
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');
  // 여러개면 위 내용 아래에 여러개 작성
}
  • fk 생성될 models 파일에 내용 추가
// 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" });
  • DB 마이그레이션
    npx sequelize db:migrate
profile
Node.js 주니어 개발자

0개의 댓글