Today I learned
오늘은 개인과제를 진행했다 어제 공부했던 sequelize를 이용해서 User, Post, Comment, Like의 관계를 연결시켜주고 CRUD를 구현하고 게시글에 댓글을 보여주기 위해서 JOIN을 sequelize로 구현하고 댓글을 최신 작성한 순으로 가져오는 작업을 진행했다 작업 중 연결이 제대로 되지 않아서 JOIN을 할 때 에러가 발생하고 JOIN이 되어도 댓글의 order DESC가 적용이 되지 않는 문제가 발생했다 그리고 커밋을 안하다가 한 번에 커밋을 하고 문제가 발생해서 커밋을 되돌렸다가 작성했던 모든게 날아가 버리는 문제가 발생했다
처음에 JOIN을 하기위해 관계를 설정해주기 위해 시도한 방식이다 아래 코드로 연결을 시켜서 JOIN을 작동했을 때 foreignkey가 제대로 작동하지 않았다
// /models/post.js
static associate(models) {
// define association here
Post.hasMany(models.Comment, { foreignKey: "post_id" });
}
// /models/comment.js
static associate(models) {
// define association here
Comment.belongsTo(models.Post);
}
다음 시도는 post_id가 있는 comment모델에 foreignkey를 설정해주는 시도를 했다
이 방식도 제대로 동작하지 않았다
// /models/post.js
static associate(models) {
// define association here
Post.hasMany(models.Comment);
}
// /models/comment.js
static associate(models) {
// define association here
Comment.belongsTo(models.Post, { foreignKey: "post_id" });
}
다음 시도에서 1:N의 관계에서 Post와 Comment에게 foreignKey는 post_id라는걸 알려주기 위해 둘 다 foreignKey를 설정했다
// /models/post.js
static associate(models) {
// define association here
Post.hasMany(models.Comment, { foreignKey: "post_id" });
}
// /models/comment.js
static associate(models) {
// define association here
Comment.belongsTo(models.Post, { foreignKey: "post_id" });
}
마지막에 시도한 Post와 Comment에게 foreignKey를 설정해준 방식에서 문제를 해결했다 아래의 코드로 JOIN을 하고 데이터를 가져오면 잘 가져온다
// /routes/posts.js
const data = await Post.findOne({
where: { id: post_id },
attributes: ["id", "title", "content", "date", "likes"],
include: [{
model: Comment,
attributes: ["id", "comment", "date"]
}]
});
정상적으로 JOIN이 작동한다
JOIN까지는 정상적으로 작동을 했다 이제 댓글을 최신순으로 뽑아오는게 문제다 처음 시도는 include안에 comment부분에 order를 설정해주는 방식으로 진행했다 하지만 order는 제대로 작동하지 않았다
const data = await Post.findOne({
where: { id: post_id },
attributes: ["id", "title", "content", "date", "likes"],
include: [{
model: Comment,
attributes: ["id", "comment", "date"],
order: [["date", "DESC"]]
}]
});
검색을 해보니까 include는 제일 상위 쿼리로 한 번에 작동한다고 한다 그래서 쿼리를 따로 작동하고 싶으면 분리를 시켜주는 옵션을 넣어줘야 한다는 것을 알았다 그래서 다음과 같은 시도를 했다
const data = await Post.findOne({
where: { id: post_id },
attributes: ["id", "title", "content", "date", "likes"],
include: [{
model: Comment,
attributes: ["id", "comment", "date"],
separate: true,
order: [["date", "DESC"]]
}]
});
결과값이 원하는대로 아주 잘 작동한다 (hasMany 관계에서만 사용이 가능하다!)
커밋을 잘못 컨트롤하고 커밋을 작은 단위로 하지 않아서 모든 작업물을 날리는 문제가 발생했는데 이 부분은 튜터님께 물어보니까 어쩔 수 없는 부분이라고 하셨다… 그래서 복습하는 마음으로 새로 작업을 시작하면서 작업물 날려먹은 문제를 시간으로 해결했다
오늘 작업을 하면서 관계를 설정하고 원하는 외래키를 사용할려면 관계가 연결되는 모델에게 어떤 외래키로 설정을 하는지를 미리 알려줘야 제대로 관계가 설정이 된다는 것과 include를 이용해서 여러개의 쿼리를 작동시키면 하나의 쿼리로 작동이 된다는 걸 알았고 그 쿼리를 개별로 작동하고 싶다면 분리를 해주는 설정을 해줘서 개별 쿼리를 작동시키는 것을 알았다 큰 단위로 커밋을 하는 것 보다 작은 단위로 커밋을 자주 하는게 더욱 안전하고 관리하기가 좋다는 걸 오늘 너무나도 잘 알아버렸다… 다음부터는 작은 단위로 커밋을 자주해야겠다고… 배웠다
'과거공부모음' 카테고리의 다른 글
나의 개발일지 WIL(Weekly I learned) 2022-12-25 (0) | 2022.12.26 |
---|---|
나의 개발일지 2022-12-23 TIL(Today I learned) - 개인과제 (0) | 2022.12.23 |
나의 개발일지 TIL(Today I learned) - Sequelize (0) | 2022.12.21 |
나의 개발일지 TIL(Today I learned) - Access Token, Refresh Token, 미들웨어, SQL, Sequelize (0) | 2022.12.20 |
나의 개발일지 TIL(Today I learned) - 미들웨어, nodemon, JWT, mongoose exec(), cookie, sesstion (0) | 2022.12.19 |