sequelize init을 하면 생기는 자동으로 생기는 seeder
폴더.
그동안 폴더 안이 비어 있어서 왜 필요한지 알지 못하다가 이번 프로젝트에서 드디어 알게 됐다.
보통 API 테스트를 하려면 기존 데이터가 필요한 경우가 많은데 이때 sql 쿼리로 직접 생성해주거나 GUI에서 일일이 넣어주고는 했다. 그런데 seeder 파일은 이런 노가다를 할 필요가 없게 만들어주는 파일이었던 것이다. seeder 파일에 넣고 싶은 데이터를 작성하고 명령어를 실행해주면 자동으로 데이터가 들어가도록 할 수 있다.
말 그대로 'seed', 씨드를 생성해주는 파일이라고 생각하면 된다.
sequelize seed:generate --name test
seeder 폴더 내에 'test'라는 이름의 seed 파일이 생긴다.
파일 명으로는 각각 데이터가 들어갈 테이블 명으로 지정해줬다.
module.exports = {
up: (queryInterface, Sequelize) => {
let datas = [
{
id: 1,
userName: "5kiran",
email: "5kiran@gmail.com",
password: "5kiran",
phone: "010-1234-5678",
createdAt: new Date(),
updatedAt: new Date(),
role: 1,
},
id: 2,
userName: "minzunim",
email: "minzunim@gmail.com",
password: "minzunim",
phone: "010-1234-5678",
createdAt: new Date(),
updatedAt: new Date(),
role: 0,
},
];
return queryInterface.bulkInsert(
"users",
datas.map((user) => ({ ...user, ...hashPassword(user.password) })),
{}
);
},
생성할 데이터므로 up
부분에 함수를 작성해주면 된다.
입력할 데이터를 datas
라는 변수에 배열로 작성해주고 queryInterface.bulkInsert()
함수를 return 한다.
첫 번째 인수는 데이터를 입력할 테이블 명이고 두 번째 인수는 입력할 데이터를 전달하면 된다.
데이터를 입력하다보니 '평문이 아닌 암호화된 비밀번호'를 어떻게 테이블에 넣을지 고민이 됐다. 팀장님한테 물어봤더니 함수를 작성해서 넣어주면 될 것 같다며 도움을 주셨다. (팀장님.. 그저 빛... ⋆ᶿ̵᷄ ˒̼ ᶿ̵᷅⋆)
const crypto = require("crypto");
// 비밀번호 해시 함수
const generageSalt = () =>
String(Math.round(new Date().valueOf() * Math.random()));
const hashPassword = (plain) => {
const salt = generageSalt();
const password = crypto
.createHash("sha512")
.update(plain + salt)
.digest("hex");
return { password, salt };
};
crypto
모듈을 불러온 다음 salt 값을 랜덤함수로 만들어준다.
그 다음 암호화된 비밀번호와 salt 값을 함께 반환하는 함수를 만든다.
return queryInterface.bulkInsert(
"users",
datas.map((user) => ({ ...user, ...hashPassword(user.password) })),
{}
);
bulkInsert()
의 두 번째 인자로 map
함수를 사용해 암호화된 비밀번호를 전달해주면 된다.
sequelize db:seed:all
seed 파일 적용 명령어를 터미널에 입력해주면 데이터가 짜라란 생성된다. 🪄
이제 손으로 노가다할 필요가 없어진 것이다!