sequelize 사용하기4 - 다대다 관계 설정, force

codeing999·2022년 8월 14일
0

Sequelize 사용 일지

목록 보기
4/10
post-custom-banner

다대다 관계 설정

유저와 게시글은 기본적으로는 1:N 관계이지만
좋아요라는 테이블을 통해서 보면,
한 유저는 여러 게시물에 좋아요를 누를 수 있고
한 게시글은 여러 유저의 좋아요를 받을 수 있으므로 M:N 즉, 다대다 관계가 된다.

sequelize로 이것을 설정하는 문법도 새로 알게되었는데 직접 해보니까, 유저와 게시글 두 테이블에 이 관계를 설정하는 것 만으로도
새로 마이그래이션을 하면, 좋아요 테이블이 자동으로 생성된다.

user 모델에는

User.belongsToMany(models.Post, {through : "Like"});

이 것을 추가하고,
post 모델에는 두 모델의 위치만 바꿔서 추가한다.
기존에 둘의 1:N 관계를 작성한 것이랑 상관없이 추가로 작성하면 된다.

그리고 나서 마이그래이션들을 언두하여 테이블 다 지운다음 다시 적용해서 새로 만들면,

이와 같이 Like 테이블이 자동 생성된 것을 확인할 수 있다.
through : "Like" 이 부분이 이것을 만들게 한 것.

테이블 내용을 보면
일단 key의 이름을 지정을 안해줘서 UserUserid, CommentCommentId 이런 식으로 지저분하게 생성된 것을 볼 수 있다.
우리가 수정을 안했더라면 sequelie가 자동으로 생성한 Primary key 이름이 그냥 id였기에 그걸로 생각해서 앞에 테이블이름을 덧붙힌 것 같다.

아무튼 key이름도 설정하게 끔 하는 구문이 더 있을 것인데 아직은 모르겠다.

그리고 이 좋아요 테이블의 PK를 보면
userId와 commentId 두개를 둘다 PK로 두고 복합키로 설정됐다는 것을 볼 수 있다.
이 부분은 의도한 대로 잘 생성된 것 같다.

문제점

like 테이블은 별다른 migration 파일 없이 자동으로 생성된 것이기 때문에 얘를 undo하는 migration 또한 없다. 이 때문에
force로 모두 테이블 드랍하고 다시 생성하는 기능이 꼬여 버린다.
자기를 참조하는 테이블이 있으면 그 테이블도 드랍이 불가능하기 때문이다.
할거면 like 테이블을 undo에 드랍하도록 하는 migration을 생성해줘야할 것 같다.

force

서버를 킬 때마다 테이블을 다 드롭하고 새로 생성하게 할 수 있는 기능같다. 아마 실제로는 모든 걸 undo 한다음 do 하는 것일지도 모르지만
나는 table 생성으로만 migration을 쓰기에 확인은 안해봤다.

const { sequelize } = require("./models");

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("db connect seccess");
  })
  .catch((err) => {
    console.error(err);
  });

이거를 app.js 상단에 작성해주면 된다.
force 값에 true를 넣으면 동작하고 false넣으면 꺼둔다.
아니면 안쓰고싶을 땐 전체 주석처리 해도되고.

profile
코딩 공부 ing..
post-custom-banner

0개의 댓글