본문 바로가기
개발/차근차근 개발일지 TIL

TIL 230425_sequelize 기반으로 게시판 api만들기1

by 코딩하는짱구 2023. 4. 25.
반응형

TIL 230425_sequelize 기반으로 게시판 api만들기1

✅오늘 학습 Keyword

MySQL, Sequelize, migration, model

✅개념정리 

Sequelize-ORM(Object Relational Mapping)으로써 자바스크립트 객채(Object)와 데이터베이스의 releationship을 Mapping해주는 도구,Sequelize와 같은 ORM들은 관계형 데이터 베이스(RDB)를 사용할 수 있다. 

 

관계형데이터베이스와 MONGOOS 차이

 

 

Sequelize의 마이그레이션, 모델

 

migration

-MySQL에 테이블을 정의하고 생성하기 위해 사용

//로그인에 필요한 기능, 이메일, 패스워드 두가지의 컬럼을 가진다.
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Users', {
      userId: {
        allowNull: false, // NOT NULL
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // Primary Key (기본키)
        type: Sequelize.INTEGER,
      },
      email: {
        allowNull: false, // NOT NULL
        type: Sequelize.STRING,
        unique: true,
      },
      password: {
        allowNull: false, // NOT NULL
        type: Sequelize.STRING,
      },
      createdAt: {
        allowNull: false, // NOT NULL
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now'),
      },
      updatedAt: {
        allowNull: false, // NOT NULL
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now'),
      },
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Users');
  },
};

 

 

 

 

model

-특정 table과 column의 속성값을 입력하여 MySQL과 Express를 mapping 시켜줌.

-즉 실제로 생성된 테이블을 연결한다.

'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Users extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here

      // 1. Users 모델에서
      this.hasOne(models.UserInfos, {
        // 2. UserInfos 모델에게 1:1 관계 설정을 합니다. //this 는 현제 테이블, 즉 User 모델
        sourceKey: 'userId', // 3. Users 테이블의 userId 컬럼을
        foreignKey: 'UserId', // 4. UserInfos 모델의 UserId 컬럼과 연결합니다.
      });

      // 1. Users 모델에서
      this.hasMany(models.Posts, {
        // 2. Posts 모델에게 1:N 관계 설정을 합니다.
        sourceKey: 'userId', // 3. Users 모델의 userId 컬럼을
        foreignKey: 'UserId', // 4. Posts 모델의 UserId 컬럼과 연결합니다.
      });
    }
  }

  Users.init(
    {
      userId: {
        allowNull: false, // NOT NULL
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // Primary Key (기본키)
        type: DataTypes.INTEGER,
      },
      nickname: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
        unique: true,
      },
      password: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
      },
      createdAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
      updatedAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
    },
    {
      sequelize,
      modelName: 'Users',
    }
  );
  return Users;
};

 

 

 

✅오늘 겪은 문제

-게시판API 구현을 위한 DB를 SEQUELIZE로 생성하였으나 필요없는 컬럼 'email'이 들어가있어서 변경하고싶었다. 

-/api/users/:userid를 통해 특정 사용자 조회를 하려했으나 특정사용자가 출력되지 않음.

✅해결방법

-userId를 끌어올 경로가 지정되어있지 않아서 발생하는 문제였고, where항목을 추가해주었다. 

사용자 번호가 인식되지않는 문제 해결

 

 

 

-아래와 같이 Users 테이블의 email 컬럼을 nickname으로 변경하고싶었다.

-우선 변경을 위한 마이그레이션을 생성해준다!

sequelize migration:create --name 생성하는 migration 이름

-그 후renameColumn() 함수를 사용하여 컬럼명을 바꿔준다.

'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up(queryInterface, Sequelize) {
    //await queryInterface.renameColumn(테이블명, 컬럼 이름 변경 전 , 컬럼 이름 변경 후 )
    await queryInterface.renameColumn('Users', 'email', 'nickname');
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  async down(queryInterface, Sequelize) {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  },
};
반응형