[TIL] 내일배움캠프 12.21

Asher Park·2022년 12월 25일
0

내일배움캠프_TIL

목록 보기
21/39
post-thumbnail

Node.js 숙련주차 과제에서 Sequelize 라는 ORM 을 사용하라고 되어있었다.

주특기 트랙 들어오기 전 미니 프로젝트 2번과 입문주차 강의와 과제까지 MongoDB를 사용하다가
숙련주차 강의 후반부에 AWS RDS로 MySQL DB를 파고 Sequelize 를 하는 것이 아닌가?

그래서 Sequelize가 뭔데?

Sequelize는 DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리다.

그래서 ORM이 뭔데?

ORM (Object-Relational Mapping)은 자바스크립트 객체관계형 데이터베이스서로 연결해주는 도구

우리는 강의에서 기본적인 DB를 만들고 외래키가 없는 상태에서의 사용법을 배웠는데
과제를 보니 생각보다 여러 제약조건이 걸려있어서 제약조건을 Migration 하는 방법을 알아봐야 했다.

알게 된 것

https://loy124.tistory.com/374

구글에서 Sequelize 외래키 생성하는 자료들을 찾아봐도 거의 예전 버전 문법으로 이루어져있어서 이해를 못하다가
위의 블로그가 지금 현재 상황과 비슷해서 참고하게 되었다.

제약 조건을 거는 migration 파일을 생성해서 migrate해주었다.

'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
    async up(queryInterface, Sequelize) {
        /**
         * Add altering commands here.
         *
         * Example:
         * await queryInterface.createTable('users', { id: 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",
        });

        // 댓글 작성자 외래키 제약조건
        await queryInterface.addConstraint("Comments", {
            fields: ['userId'],
            type: 'foreign key',
            name: 'Users_Comments_id_fk',
            references: {
                table: "Users",
                field: "userId",
            },
            onDelete: "cascade",
            onUpdate: "cascade",
        });

        // 댓글 어느 게시글에 달렸는지 외래키 제약조건
        await queryInterface.addConstraint("Comments", {
            fields: ['postId'],
            type: 'foreign key',
            name: 'Posts_Comments_id_fk',
            references: {
                table: "Posts",
                field: "postId",
            },
            onDelete: "cascade",
            onUpdate: "cascade",
        });
      
      	// 좋아요 누른사람 외래키
        await queryInterface.addConstraint("Likes", {
              fields: ['userId'],
              type: 'foreign key',
              name: "Users_Likes_id_fk",
              references: {
                  table: "Users",
                  field: "userId",
              },
              onDelete: "cascade",
              onUpdate: "cascade",
          });
      
        // 좋아요 누른 게시글 번호 외래키
          await queryInterface.addConstraint("Likes", {
              fields: ['postId'],
              type: 'foreign key',
              name: "Posts_Likes_id_fk",
              references: {
                  table: "Posts",
                  field: "postId"
              },
              onDelete: "cascade",
              onUpdate: "cascade",
          });
    },

    async down(queryInterface, Sequelize) {
        /**
         * Add reverting commands here.
         *
         * Example:
         * await queryInterface.dropTable('users');
         */
        await queryInterface.removeColumn("Posts", "userId");
        await queryInterface.removeColumn("Comments", "userId");
        await queryInterface.removeColumn("Comments", "postId");
      	await queryInterface.removeColumn("Likes", "userId");
        await queryInterface.removeColumn("Likes", "postId");
    }
};
  • fields: 외래키로 설정할 컬럼
  • type: 제약조건 종료
  • name: 제약조건 이름
  • references: 참조할 테이블과 컬럼
  • onDelete: Delete 옵션
  • onUpdate: Update 옵션
profile
배움에는 끝이없다

0개의 댓글