VPS-7
웹사이트 로그인을 하던 중 문제가 생겼다. 하나는 내가 로그아웃을 까먹어도 시간이 지나면 자동으로 연결을 끊어주지 않고 계속 연결되어있는 문제였다.
두 번째는 한 번 회원가입을 끝내면 닉네임 수정이 불가능하다는 것이다. 덕분에 로그인할 때 마다 lajancia가 아닌 laajncia로 나온다. (불편)
포스팅을 추가했지만, 별도로 삭제 기능이 없다.
Delete api
포스팅한 포스트를 삭제하는 api를 만들어보자.
router.post(
"/delete/:id",
isLoggedIn,
upload2.none(),
async (req, res, next) => {
try {
const post = await Post.destroy({
where: {
id: req.params.id,
},
});
console.log("redirect");
res.redirect("/indexpage");
} catch (error) {
console.error(error);
next(error);
}
}
);
프론트엔드에서 delete api 호출이 발생할 경우, 해당 id와 일치하는 content 데이터를 Post 테이블에서 삭제하는 기능을 수행한다.
프론트엔드에서 delete api에 id를 넣어 보내주기 위해 별도로 methods를 이용하여 함수를 생성하고 이를 통해 post api 호출을 시도하였다.
methods: {
deletefunc(id) {
this.$http.post(`/api/post/delete/${id}`).then((res) => {
console.log(res);
});
window.location.reload();
},
},
cost column 추가
이제 delete api를 만들었으니, 컨텐츠에 해당하는 가격을 저장할 cost column을 추가할 차례다. post 테이블을 생성한 곳에 추가 칼럼을 생성한다.
const Sequelize = require("sequelize");
module.exports = class Post extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
content: {
type: Sequelize.STRING(140),
allowNull: false,
},
cost: {
type: Sequelize.INTEGER(10),
allowNull: false,
},
},
{
sequelize,
timestamps: true,
underscored: false,
modelName: "Post",
tableName: "posts",
paranoid: false,
charset: "utf8mb4",
collate: "utf8mb4_general_ci",
}
);
}
static associate(db) {
db.Post.belongsTo(db.User);
db.Post.belongsToMany(db.Hashtag, { through: "PostHashtag" });
}
};
이슈
cost 칼럼을 입력했지만 찾을 수 없다는 문제가 발생했다. 이는 초기에 생성된 테이블에 추가로 칼럼을 만들 시 데이터베이스에 적용되지 않는 문제가 있기 때문이다. 이를 위해서는 migration을 이용하여 추가할 칼럼을 지정해주어야 한다.
npx sequelize migration:create --name add-column
위의 명령어를 입력하면 migrations 폴더 안에 파일이 생성된다. 여기서 추가할 칼럼을 지정한다.
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
return queryInterface.addColumn("Posts", "cost", {
type: Sequelize.STRING(10),
allowNull: false,
});
/**
* Add altering commands here.
*
* Example:
* await queryInterface.createTable('users', { id: Sequelize.INTEGER });
*/
},
async down(queryInterface, Sequelize) {
/**
* Add reverting commands here.
*
* Example:
* await queryInterface.dropTable('users');
*/
},
};
파일을 변경하고 난 뒤, 데이터베이스에 마이그레이션을 수행한다.
npx sequlize db:migrate
이제 cost 칼럼이 추가되었다.
칼럼 데이터 타입 변경
칼럼 추가를 한 것 까지는 좋았지만 문제는 가격을 interger 타입이 아닌 string 타입으로 생성했다는 것이다. 다시 타입만 변경하도록 migrations을 다시 수행한다.
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
return queryInterface.changeColumn("Posts", "cost", {
type: Sequelize.INTEGER(10),
allowNull: false,
});
/**
* Add altering commands here.
*
* Example:
* await queryInterface.createTable('users', { id: Sequelize.INTEGER });
*/
},
async down(queryInterface, Sequelize) {
/**
* Add reverting commands here.
*
* Example:
* await queryInterface.dropTable('users');
*/
},
};
add column 대신 changeColumn을 사용하였다.
이슈
문제는 이미 칼럼이 생성된 상태에서 ‘’ 라는 string 데이터들이 들어있었기 때문에 타입 변경이 되지 않았다. 어쩔 수 없이 mysql을 열어 테이블을 조회하였다.
SELECT * FROM mysql.posts;
데이터베이스를 조회해본 결과, cost값이 비어있는 것을 확인하였다. 저장된 데이터가 많지 않았기에 그냥 수동으로 값을 추가하였다.
다시 마이그레이션을 수행하면 정상적으로 cost의 타입이 변경되는 것을 확인할 수 있다.