[Node] 유저 모델을 수정하고 db 스키마를 업데이트 하려면?
토이프로젝트를 만들면서 풀스택을 찍먹하게 되다보니 노드, db를 만지게 되었습니다.
백엔드는 작업할 때마다 불안하고 무섭더라구요..ㅎㅎ
초반에 잘 진행되는 듯하다가 만들어놨던 유저 모델을 수정하게 되었는데,
이게 그냥 수정하면 되는게 아니라 수정하고 db도 업데이트 할 수 있게 migrate을 해줘야 했습니다.
백엔드 초짜인 저는 참 쉽지않았었기에 내용을 블로그에 담으려고 합니다.
사용
- Node.js: 자바스크립트 런타임 환경
- Express: 웹서버 구축을 위한 웹 프레임워크, 라이브러리
- Sequelize: ORM (Object-Relational Mapping) 라이브러리. node.js와 데이터베이스 상호작용 위함, 라이브러리
- MySQL: 관계형 데이터베이스 (RDBMS)
처음 모델을 스키마로 만들때
/models/post.js
module.exports = (sequelize, DataTypes) => {
// 자동으로 소문자 / 복수가 되어서 MySql에 posts로 저장된다.
const Post = sequelize.define('Post', {
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
}, {
charset: 'utf8mb4',
collat: 'utf8mb4_general_ci' // 한글 + 이모티콘 저장
});
Post.associate = (db) => {
db.Post.belongsTo(db.User);
// post.addUser, post.getUser, post.setUser, post.removeUser 단수면 그냥, 복수면 s붙여서
}
return Post;
}
처음 post.js라는 모델을 만들고
/models/index.js
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
// node랑 mysql 연결해준다. 노드랑 mysql연결해주는 드라이버 mysql2에 설정을 보내줘서 연결에 도움을 준다.
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.Post = require('./post')(sequelize, Sequelize);
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
index.js에서 모델을 가져와서 sequelize로 node와 mysql(데이터베이스)를 연결시켜준다.
후에 이를 app.js로 가져와서
/app.js
const db = require('./models');
db.sequelize.sync()
.then(() => { console.log('db 연결 성공') })
.catch(console.error);
sequelize를 실행시켜준다.
이렇게 되면 없는 스키마는 새로생성, 있는 스키마는 통과한다.
이래서 모델을 수정하게 되면 따로 추가적인 작업이 필요한 것이다.
모델을 수정하더라도, 이미 있던 스키마이기 때문에 그냥 통과해서 수정된것을 적용하지 않게 된다.
수정한 모델을 가지고 스키마 마이그레이션 해줘야할 때
만일 아래와 같이 수정하게 되면
/model/post.js
module.exports = (sequelize, DataTypes) => {
// 자동으로 소문자 / 복수가 되어서 MySql에 posts로 저장된다.
const Post = sequelize.define('Post', {
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
region: {
type: DataTypes.STRING(30),
allowNull: false,
},
}, {
charset: 'utf8mb4',
collat: 'utf8mb4_general_ci' // 한글 + 이모티콘 저장
});
Post.associate = (db) => {
// post.addUser, post.getUser, post.setUser, post.removeUser 단수면 그냥, 복수면 s붙여서
db.Post.belongsTo(db.User);
db.Post.hasMany(db.Image);
db.Post.belongsToMany(db.User, { through: "Likes", as: "Likers" });
}
return Post;
}
마이그레이션 파일 만들기
아래 명령어를 치면 migration 폴더가 생기면서 name에서 지정한 파일이 생긴다.
npx sequelize-cli migration:generate --name add-phoneNumber-to-user
들어가보면 이런 식으로 되어있는데
여기다가 수정한 model 내용을 추가해주면 된다.
module.exports = {
up: (queryInterface, Sequelize) => {
// 삭제하거나 수정할 내용
},
down: (queryInterface, Sequelize) => {
// 삭제할 이전 내용
},
};
예시
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Users', {...})
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('Users');
}
};
이런식으로 해주게되면 기존 user스키마는 지워지고 새로운 스키마를 추가, 하게 되고
스키마 전체가 아니라 특정 컬럼만 지우고 추가할 수도있다.
그런데 모델안에 있는 associate같은 경우엔 추가하지 않고 저렇게 마이그레이션 하게되면 자동으로 읽어가는것 같았다.
마이그레이션 실행
npx sequelize-cli db:migrate
후에 명령어를 실행해서 마이그레이션 해주면 끝이다!
코드 적용 및 테스트
모델 수정 및 스키마 업데이트가 완료되면, 애플리케이션 코드에 해당 변경 사항을 반영하고, 새로운 필드를 사용하는 코드를 추가합니다.
이후 서버를 재시작하고, 새로 추가된 필드가 정상적으로 동작하는지 테스트합니다.
요약
- 모델 수정: User 모델에 새로운 필드를 추가하거나 기존 필드를 수정.
- 마이그레이션 파일 생성: 새로운 마이그레이션 파일을 생성하여 데이터베이스 스키마 변경 사항을 정의.
- 마이그레이션 실행: 마이그레이션을 실행하여 데이터베이스 스키마를 업데이트.
- 코드 적용 및 테스트: 변경 사항을 코드에 반영하고, 정상적으로 동작하는지 테스트.
이 과정을 통해 유저 모델을 수정하고 데이터베이스 스키마를 업데이트할 수 있습니다.
프론트던 백엔드더 너무 겁먹지말고 삽질하더라도 잘 찾아보고 해봅시다! 화이팅!
'node.js' 카테고리의 다른 글
[Node] 쿠키 전달이 안돼서 로그인이 안된다면? (express) (0) | 2024.05.05 |
---|---|
[Node] Node.js + mySQL + Sequelize로 데이터베이스 테이블 만들어보자 (0) | 2024.05.01 |
댓글