내배캠 41일차

·2022년 12월 24일
0

내일배움캠프

목록 보기
44/142
post-thumbnail

과제하기 위해서 급하게 sequelize를 배우느라 제대로 이해하지는 못하고 사용한 것 같아서 정리해 보고자 한다.

sequelize

migraiton

테이블생성

일단 터미널에

npx sequelize model:generate --name post --attributes title:string,content:string 

명령어 입력해서 migration파일을 하나 생성해준다.
그럼 내부에 어느정도 코드가 작성되어있다.
이제 async up부분에서 테이블을 만드는 코드를
async down부분에 테이블을 삭제하는 코드를 작성해준다.

테이블을 생성할때는 createTable, 삭제할때는 droptable을 사용한다.

module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable("Posts", {
      postId: {
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
        type: Sequelize.INTEGER,
      },
      title: {
        allowNull: false,
        type: Sequelize.STRING,
      },
      content: {
        allowNull: false,
        type: Sequelize.TEXT,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable("Posts");
  },
};

이런식으로!

foreign key 설정

외래 키 설정도 먼저 migration 파일을 먼저 만들어준다. 아까 테이블을 만들었을 때와는 명령어가 조금 다르다.

npx sequelize migration:generate --name fk-comment

명령어를 치고나면 똑같이 파일이 만들어지고 또 async up, down이 존재한다. 아까와 마찬가지로 생성과 삭제를 코드를 나누어 작성해주면 된다.

방금 예시로 Posts table을 만들었으니 외래 키 예시도 post로 들자면 post에는 누가 작성했는지 user 테이블에서 userId를 가져와야 한다.
만약 Comments table이라면 어떤 게시물에 댓글이 작성되었는지 누가 작성했는지가 필요하기 때문에 post의 postId와 user의 userId 두 개가 필요하다.

외래키를 만들때 사용하는 함수는 addColumn, addConstraint 두 가지를 사용한다.
삭제는 removeColumn을 사용한다.

userId라는 칼럼을 먼저 만들어주고 foreign key를 설정해 주는 것이다.

async up(queryInterface, Sequelize) {
  //게시글 작성자 외래키
  await queryInterface.addColumn("Posts", "userId", {
    type: Sequelize.INTEGER,
  });
  await queryInterface.addConstraint("Posts", {
    fields: ["userId"],
    type: "foreign key",
    name: "Users_Posts_id_fk",
    references: {
      table: "Users",
      field: "userId",
    },
    onDelete: "cascade",
    onUpdate: "cascade",
  });
},

async down(queryInterface, Sequelize) {
    await queryInterface.removeColumn("Posts", "userId");
  }
};

이런식으로!

onDelete와 onUpdate는 user가 사라지면 같이 없어지고 user의 정보가 update되면 같이 수정되어야하기때문에 cascade로 준 것이다!

column 변경

코드를 작성하다가 보니 comment의 content가 post의 content와 겹치게 이름이 설정되어 이 부분을 변경하고 싶어졌다.

똑같이 외래키를 생성할때와 같이 터미널에 명령어를 써주어 migration파일을 만들어주고 async up부분에 코드를 써주면 된다.

수정할 때는 renameColumn함수를 사용한다.

migrate

이제 migration 파일의 코드를 다 작성해주었으면 적용을 해야하겠죠? 그러기위해 다음과 같은 코드를 터미널에 작성해주면 mysql에 적용이 됩니다!

npx sequelize db:migrate

model

migration을 통해 DB의 내용은 변경해 주었으니 Model에서 매핑 작업을 해줄 것이다.

각 테이블에 외래키를 설정해주었으니 그 관계를 model에서 세부적으로 지정해주는 작업이 필요하다.

1:N 관계 설정
1대 다 관계(EX) 유저(1) 가 게시글들(N)을 보유)
hasMany < - > belongsTo
1:1 관계 설정
hasOne < -> belongsTo
N:M 관계 설정
belongsToMany

또 예시로 post를 들자면
user:post => 1:N
post:comment => 1:N
post:like => 1:N

module.exports = (sequelize, DataTypes) => {
  class Post extends Model {
    static associate(models) {
      models.Post.belongsTo(models.User, { foreignKey: "userId" });
      models.Post.hasMany(models.Comment, { foreignKey: "postId" });
      models.Post.hasMany(models.Like, { foreignKey: "postId" });
    }
  }
  Post.init(
    {
      postId: {
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
        type: DataTypes.INTEGER,
      },
      title: {
        allowNull: false,
        type: DataTypes.STRING,
      },
      content: {
        allowNull: false,
        type: DataTypes.TEXT,
      },
      likes: {
        defaultValue: 0,
        type: DataTypes.INTEGER,
      },
    },
    {
      sequelize,
      modelName: "Post",
    }
  );
  return Post;
};

Post.init에는 DB에 저장되어 있는 내용을 정확히 지정해 주면 좋기 때문에 앞서 migraiotn 파일에서 작성한 내용을 복사 붙여넣기 해주었다.

내일 해야 할 일

  • 알고리즘 문제 풀기
  • 과제코드 복습
profile
개발자 꿈나무

0개의 댓글