Today I learned
오늘은 개인과제를 진행했다 강의로 학습했던 부분을 이용해서 과제를 진행하는데 이번 강의는 솔직히 너무 부실하고
난잡했다 그래서 더욱 무슨 내용인지 이해를 못했다 따라서 과제를 진행하기 위해서 처음부터 sequelize 다시 학습을 진행했다
Sequelize
/config/config.json
DB커넥션 정보를 각 환경에 맞게 설정할 수 있다
{
"development": {
"username": "root",
"password": "1234",
"database": "dev_database",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
},
...
}
username : DB 사용자명
password : DB 비밀번호
database : RDB에서 사용할 database이름
host : host 주소
dialect : 사용할 RDB 이름
operatorsAliases : 연산자에 대한 별칭을 사용할 것인지
sequelize를 사용하기 위해 환경을 설정하는 부분
/models/index.js
- /config/config.json 파일의 설정 값을 읽어 sequelize를 생성
- models 폴더 아래에 존재하는 js파일을 모두 로딩
- db객체에 Model을 정의하여 반환
여러 모델을 db의 객체에 담아 반환하는 역할을 한다
Model을 정의하고 관계를 설정해주는 역할
sync() 메서드를 호출하여, sequelize 실행 테스트
시퀄라이즈는 CRUD의 데이터 조작뿐 아니라 데이터의 정의도 지원한다
따라서 만들어진 테이블에 Model을 매핑할 수 있을 뿐 아니라 DB테이블이 없는 상태라면
정의한 Model을 바탕으로 테이블을 생성할 수도 있다
이를 수행하는 메서드가 sync()이며 모델에서 정의한 이름을 갖는 테이블이 존재하지 않을
경우에만 동작한다
sync()메서드를 호출해서 시퀄라이즈 연동 확인
const models = require("./models/index.js");
models.sequelize.sync().then( () => {
console.log(" DB 연결 성공");
}).catch(err => {
console.log("연결 실패");
console.log(err);
})
npm start
서버를 실행하여 DB 연결 성공 로그가 출력되면 정상적으로 Model이 등록된 것이고 시퀄라이가 잘 연동 된거라고 보면 된다
Model을 정의한 게 없으면 아무런 변화가 없다
모델 정의하기 CLI로 정의
CLI를 통해서 모델을 정의해보자
npx sequelize model:create --name post --attributes "title:string, content:string"
명령어를 입력하면 새로운 model과 migration이 생성된다
migrations 폴더
- 현재 시간을 이름으로 갖는 migration파일이 생성
models 폴더
- post.js 파일이 생성
npm start
모델을 정의하고 서버를 실행하면 정의한 테이블이 생성된다
id, createAt, updateAt 3개의 필드가 자동으로 생성된다
모델 정의하기 옵션 설정
CLI로 모델을 정의할 때 unique, Not NULL 같은 옵션을 설정해보자
// /models/post.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var post = sequelize.define('post', {
title: {
type: DataTypes.STRING,
unique: true
},
content: {
type: DataTypes.STRING,
allowNull: false
}
}, {
classMethods: {
associate: function(models) {
// associations can be defined here
}
}
});
return post;
};
저장하고 새롭게 정의한 상태에서 기존 테이블을 삭제하고 다시 서버를 실행하면 옵션이 바뀐 것을 확인할 수 있다
모델 정의하기 migration
CLI로 모델을 정의할 때 생성된 migration파일과 post.js파일은 같은 내용이다
근데 위해서 옵션을 설정하면서 내일이 달라져 migration파일의 테이블 정의를 맞춰줘야 한다
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('post', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
title: {
type: Sequelize.STRING,
unique: true
},
content: {
type: Sequelize.STRING,
allowNull: false
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('post');
}
};
DataTypes를 Sequelize로 바꿔주면 된다
migration 파일을 수정했으면 명령어를 실행하자
npx sequelize db:migrate
정의된 부분이 migrate되고 두 파일이 일치하게 된다
migration 파일을 보면 up down 기능이 있다
- "up"은 데이터베이스를 변경
- sequelize db:migrate 명령어 실행 시, up에 정의된 코드 실행
- "down"은 "up"이 실행되기 전의 상태로 데이터베이스를 복원
- sequelize db:migrate:undo 명령어 실행 시, down에 정의된 코드 실행