오랜만에 시퀄라이즈를 처음부터 설정하려니 의외의 에러들을 만났다.
사소한 것들일 수 있지만 다음에 같은 실수를 반복하지 않기 위해 정리해본다.
npm i sequelize mysql2 -S
npm i sequelize-cli -D
npx sequelize init
내 프로젝트 폴더 이름
├── models
│ └── index.js
├── config
│ └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
require("dotenv").config("../../.env");
const development = {
username: process.env.SEQUELIZE_DEVELOPMENT_USERNAME || "root",
password: process.env.SEQUELIZE_DEVELOPMENT_PASSWORD || null,
database: process.env.SEQUELIZE_DEVELOPMENT_DATABASE || "nodephoenix",
host: process.env.SEQUELIZE_DEVELOPMENT_HOST || "127.0.0.1",
dialect: "mysql",
};
위와 같이 process.env.SEQUELIZE_DEVELOPMENT_USERNAME 로 값을 변경해주고 .env 파일에 정보를 기입해둔다.
SEQUELIZE_DEVELOPMENT_USERNAME= # 개인 아이디로 설정
SEQUELIZE_DEVELOPMENT_PASSWORD= # 개인 비밀번호로 설정
SEQUELIZE_DEVELOPMENT_DATABASE=nodephoenix
SEQUELIZE_DEVELOPMENT_HOST=127.0.0.1
.env 파일은 .gitignore 파일에 적어두면 github에 push할 때 포함되지 않는다.
npx sequelize db:create
npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string
주의할 점은 --attributes 뒤의 키와 데이터 타입들은 쉼표로 연결되어 있는데 띄어쓰기를 하면 안 된다는 것이다.
// 띄어쓰기를 입력한 경우 발생하는 에러
unknown argument: ~
따옴표를 넣어주면 띄어쓰기도 가능하다.
sequelize model:create --name user --attributes "email:string, name:string, password:string
npx sequelize db:migrate
테이블 간 참조 관계를 설정할 때는 model 파일 내부의 static associate(models) 안에 코드를 작성해야 한다.
static associate(models) {
models.Product.hasMany(models.Order_product, {
foreignKey: "user_id",
sourceKey: "id",
});
models.Product.hasMany(models.Cart, {
foreignKey: "product_id",
sourceKey: "id",
});
}
hasMany() 인자로 참조 관계를 설정할 모델과 key들을 설정해주면 된다.
static associate(models) {
models.Order.belongsTo(models.User, {
foreignKey: "user_id",
targetKey: "id",
});
}
hasMany()의 반대에 있는 테이블에는 belongsTo와 key를 설정해줘야 한다.
이 부분은 설계한 ERD에 따라 달라지는데 다대다, 일대다 관계에 따라 적용해야 하는 함수가 달라진다.
정석대로라면 migration 파일을 만들어서 여기에 작성하고 migrate 명령어를 입력해줘야 하지만,
sequelize.sync() 함수를 써주면 서버가 재시작할 때 자동으로 데이터베이스를 migrate 해준다.
sequelize
.sync({ force: false })
.then(() => {
console.log("데이터베이스 연결 성공!");
})
.catch((err) => {
console.error(err);
});
force: true
: 서버가 재시작할 때마다 공장초기화가 된다.force: false
: 서버가 재시작해도 함수가 작동하지 않는다.alter: true
: 서버 재시작 시 변경사항을 migrate 한다.