내일배움캠프 이커머스 프로젝트 (1) sequelize 설정

Jiumn·2023년 2월 1일
0

오랜만에 시퀄라이즈를 처음부터 설정하려니 의외의 에러들을 만났다.
사소한 것들일 수 있지만 다음에 같은 실수를 반복하지 않기 위해 정리해본다.

sequelize 초기 설정 명령어

  • 모듈 설치 (sequelize, mysql2, sequelize-cli)
npm i sequelize mysql2 -S
npm i sequelize-cli -D
  • sequelize 초기화
npx sequelize init
  • 초기화 후 폴더 구조 자동 생성
내 프로젝트 폴더 이름
├── models
│   └── index.js
├── config
│   └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
  • config.js
    * config.json 파일이 생성되는데 이 안에는 DB 정보가 입력되어 있다.
    github에 DB 정보 중 비밀번호와 같은 중요 정보들을 노출하지 않기 위해 .env 파일을 사용한다.
    dotenv 모듈을 설치해준 다음 config.json 파일을 config.js로 변경해준다.
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할 때 포함되지 않는다.

  • DB 생성
npx sequelize db:create
  • model 생성
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
  • DB migrate (테이블 생성)
npx sequelize db:migrate

Sequelize association (외래키, foreignKey) 설정 방법

테이블 간 참조 관계를 설정할 때는 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() 함수 사용
sequelize
  .sync({ force: false })
  .then(() => {
    console.log("데이터베이스 연결 성공!");
  })
  .catch((err) => {
    console.error(err);
  });
  • force: true: 서버가 재시작할 때마다 공장초기화가 된다.
    DB 안의 모든 데이터가 사라질 수 있으니 주의하자.
  • force: false: 서버가 재시작해도 함수가 작동하지 않는다.
  • alter: true: 서버 재시작 시 변경사항을 migrate 한다.
    다만, 변경 사항이 기존에 입력되어 있는 데이터들과 충돌이 발생하는 등 문제가 있으면 실행이 되지 않는다. (데이터 타입이 string인데 데이터는 number가 되어 있는 경우 등)
profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글