내일배움캠프 TIL (230203): 이커머스 프로젝트 3일차 - sequelize seeder 폴더 파일 생성하기

Jiumn·2023년 2월 5일
0

seeder 파일이 필요한 이유

sequelize init을 하면 생기는 자동으로 생기는 seeder 폴더.
그동안 폴더 안이 비어 있어서 왜 필요한지 알지 못하다가 이번 프로젝트에서 드디어 알게 됐다.

보통 API 테스트를 하려면 기존 데이터가 필요한 경우가 많은데 이때 sql 쿼리로 직접 생성해주거나 GUI에서 일일이 넣어주고는 했다. 그런데 seeder 파일은 이런 노가다를 할 필요가 없게 만들어주는 파일이었던 것이다. seeder 파일에 넣고 싶은 데이터를 작성하고 명령어를 실행해주면 자동으로 데이터가 들어가도록 할 수 있다.

말 그대로 'seed', 씨드를 생성해주는 파일이라고 생각하면 된다.

seed 파일 작업 프로세스

  • seeder 파일 생성 명령어
sequelize seed:generate --name test

seeder 폴더 내에 'test'라는 이름의 seed 파일이 생긴다.
파일 명으로는 각각 데이터가 들어갈 테이블 명으로 지정해줬다.

  • seeder 내용 작성하기
    다음은 users 테이블의 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 함수를 사용해 암호화된 비밀번호를 전달해주면 된다.

  • seed 파일 적용 명령어
sequelize db:seed:all

seed 파일 적용 명령어를 터미널에 입력해주면 데이터가 짜라란 생성된다. 🪄
이제 손으로 노가다할 필요가 없어진 것이다!

profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글