유저와 게시글은 기본적으로는 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을 생성해줘야할 것 같다.
서버를 킬 때마다 테이블을 다 드롭하고 새로 생성하게 할 수 있는 기능같다. 아마 실제로는 모든 걸 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넣으면 꺼둔다.
아니면 안쓰고싶을 땐 전체 주석처리 해도되고.