Node.js 숙련 [마지막날]
sequelize 패키지를 이용해 회원가입 및 로그인, 상품 등록/수정/삭제 하는 프로젝트를 마무리했다.
바꿔야할 부분은 많지만 기능 구현이 되지 않았던 부분은 두 개의 테이블을 join한 뒤 원하는 데이터를 출력하는 부분이 되지 않아 오늘 하루를 전부 테이블을 합치는데 썼다.
기존에 내가 만들었던 방식은 두 개의 테이블을 합치고 queryInterface.addColumn 이라는 메서드를 통해 foreign key를 새로운 column으로 반환하려고 시도했다. 하지만 foreign key를 column으로 한 column이 찾을 수 없다는 값이 나왔다.
그래서 테이블 내에 column이 생성되었는지 확인해봤는데 column은 생성되어 있지 않았고 column 값을 확인할 수 없다는 오류만 뜨게 되었다.
// user table의 nickName 추가
await queryInterface.addColumn(
"Goods",
"fk_nickName",
{
type : Sequelize.STRING,
references: {
model: "User",
key: "nickname"
}
}
);
결국 addColumn을 통한 새로운 컬럼 생성을 포기하고 기존의 column에 연결하기로 했다.
정말 많은 블로그들을 참조하며 모두 따라해보고 그 하나하나의 블로그를 참고해보면서 내 코드와 맞게 한 블로그를 가지고 여러 방향으로 많은 도전을 해봤다.
https://velog.io/@mero/sequelize-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B02
https://kyounghwan01.github.io/blog/etc/sequelize/sequelize-join/#include
https://study-ihl.tistory.com/103
https://velog.io/@mero/sequelize-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B02
https://velog.io/@jiheon/Node.js-Sequelize-Associate
https://velog.io/@younghwan/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80
https://sequelize.org/api/v6/class/src/associations/belongs-to.js~belongsto
위 블로그들 뿐만 아니라 훨씬 많은 블로그들을 찾아봤다. 진짜 오만가지 방법을 다해봤는데 안된다.
goods와 user 모델, migration 문제이기에 모델도 바꿔보고 migration도 바꿔보고 index.js에 추가해보래서 추가도 해보고 foreign key변경, as값 변경, sequelize-cli최신화 user를 users로 바꾸는 등 정말 정말 많은 시도를 했다.
하지만 결국 마지막에 나오는 오류는 'user와 goods를 연결할 수 없다' 였다.
하지만 마지막 카드가 있었다.
https://velog.io/@jiheon/Node.js-Sequelize-Associate
이 블로그에서는 정말 상세하게 모델 두 개와 migration 두 개의 변경을 통해 테이블을 join하는 방법에 대해 적어놨다.
시도했다.
하지만 안됐다.
어?
생각해보니까 migration값을 바꿔주면 migration을 지워줬다가 다시 테이블을 생성해줘야 하지 않던가?
마음이 급박해졌다. 해결할 수 있을 것 같았다.
내가 왜 이걸 까먹고 있었지?
바로 npx sequelize db:migrate:undo:all 을 쳤다.
동시에 테이블의 형태는 남아있는 것 같아 dbeaver에서 테이블 자체도 지워줬다.
그리고서 떨리는 마음으로 npx sequelize db:migrate
!
!!
!!!
어? 잘만 만들어졌고 잘만 쓰던 migration으로 테이블이 안만들어진다고?
migration과 model부분을 이것 저것 바꾼게 문제인가 싶어 어느 부분이 문제인지 하나하나 주석처리를 해가며 다시 migrate와 migrate:undo를 반복했다.
결론은 하나.
migration을 건들지 않았던 처음 상태로 만들면 테이블을 생성하는 명령어가 잘 먹는다. 하지만 조금이라도 고치게 되면 user를 찾을 수 없다고 나오며 에러 메세지가 뜬다....
하..............
일단 코드로 적어두려고 한다.
// migration/user
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
email: {
type: Sequelize.STRING
},
nickname: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue : Sequelize.fn("now")
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue : Sequelize.fn("now")
}
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('Users');
}
};
//migration/goods
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable('Goods', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
productName: {
type: Sequelize.STRING
},
content: {
type: Sequelize.STRING
},
status: {
type: Sequelize.STRING,
},
userId: {
type: Sequelize.STRING,
references: {
model: "Users",
key: "nickname"
}
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue : Sequelize.fn("now")
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue : Sequelize.fn("now")
}
})
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('Goods');
}
};
// models/goods.js
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class Goods extends Model {
// static associate(models) {
// Goods.belongsTo(models.Users, {
// foreignKey: "fk_userId",
// as: "user",
// });
// }
}
Goods.init(
{
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER,
},
productName: DataTypes.STRING,
content: DataTypes.STRING,
status: DataTypes.STRING,
userId: DataTypes.STRING,
},
{
sequelize,
modelName: "Goods",
}
);
return Goods;
};
// models/user.js
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class Users extends Model {
// static associate(models) {
// Users.hasMany(models.Goods, {
// foreignKey: "userId",
// as: "goods",
// });
// }
}
Users.init(
{
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER,
},
email: DataTypes.STRING,
nickname: DataTypes.STRING,
password: DataTypes.STRING,
},
{
sequelize,
modelName: "Users",
}
);
return Users;
};
// models/index.js
const Sequelize = require("sequelize");
const config = require("../config/config.json");
const { username, password, database, host, dialect } = config.development;
const sequelize = new Sequelize(database, username, password, {
host,
dialect,
});
const User = require("./user")(sequelize, Sequelize.DataTypes);
const Goods = require("./goods")(sequelize, Sequelize.DataTypes);
const db = {};
db.User = User;
db.Goods = Goods;
module.exports = db;
// 이런 시도도 있었다
// User과 Goods 테이블 연결
User.hasMany(Goods);
Goods.belongsTo(User, {
foreignKey: "fk_nickname",
as : "nickname"
})
위의 코드들에서 주석친 부분을 제외하면 원래 처음 생성했던 코드와 동일하다. 주석친 부분은 테이블끼리 합치기 위해 넣어놨으며 주석친 부분을 주석 해제하게 되면 테이블이 생성되지 않고 주석을 그대로 놔두면 테이블이 합쳐지지 않는다.
매일 하루에 하나씩 엄청나게 많은 시간을 잡고 있는 것 같다.
일단 오늘은 여기까지다. 테이블만 12시간봤다. 지친다.
결국 한게 원상태라니...
내일 할 일은 테이블, migration model까지도 전부 다 지우고 다시 작업해봐야겠다. 왜냐하면 처음에 model을 생성했을 때 user를 복수로 생성안했던 게 살짝 걸리기도 한달까... 일단 찝찝한 부분은 없이 넘어가야하니까..
내일 계획상으론 팀프로젝트 시작 날인데 만약 내일부터 시작하게 된다면 프로젝트부터 시작하고 아니라면 내 원래코드를 고치고 과제 해설영상을 따라 보고 만들어보는 시간을 가지려고 한다.
어쩌다보니 그냥 길게 써졌다. 해결이 안돼서 길게 쓴걸지도... 다른 날은 보통 새벽3시쯤까지 되면 해결되기 때문에 TIL을 엄청 늦게 쓰거나 다음날 아침에 간략하게 쓰는 경우가 많은데 오늘은 포기하고 평소보다 일찍 자려고 한다.
'TIL' 카테고리의 다른 글
2023-11-22 TIL (0) | 2023.11.23 |
---|---|
2023_11_21 TIL (2) | 2023.11.22 |
2023_11_16 TIL (1) | 2023.11.17 |
2023_11_15 TIL (1) | 2023.11.16 |
2023_11_14 TIL (0) | 2023.11.15 |