[node.js] sequelize 로 테이블 연동하기

iberis2·2024년 2월 11일

(1) 자바스크립트 코드 상의 Member 모델과
(2) COWORK 데이터베이스에 있는 Members 테이블을 연동하기 위해 필요한 작업정리

1. MySQL 서버 설치 및 MySQL 서버 실행한 상태로 두기

2. Sequelize를 사용하기 위해 필요한 패키지들 설치

npm install mysql2 sequelize sequelize-cli

sequelize-cli는 Sequelize로 데이터베이스 작업을 하기 위한 필수 요건은 아니지만 이 패키지가 제공하는 다양한 명령어를 사용해서 프로젝트를 세팅하는 것이 좋다.

3. Sequelize를 사용하는 프로젝트의 이상적인 구조를 만들기 위해 필요한 디렉토리 및 파일 생성

npx sequelize init

config, migrations, models, seeders 디렉토리 생성
config/config.json 파일 생성
models/index.js 파일 생성

4. config.json 파일 중 development 객체에 MySQL 서버 접속 정보 설정

// ./config/config.json

// ... 생략
development: {
    username: 'root',
    password: '123123123',
    database: 'COWORK',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
// ...생략

5. COWORK 데이터베이스 생성

npx sequelize db:create --env development

config.json 파일의 development 객체의 내용대로 MySQL 서버에 접속해서 COWORK 데이터베이스를 생성한다.

  • config.json 의 { database : "이름" } 으로 설정한 이름으로 데이터베이스를 생성한다

--env development 옵션을 주지 않아도 기본으로 development 옵션이 적용되기 때문에 생략해도 된다.

6. Members 테이블 생성 마이그레이션 파일 및 Member 모델 파일 생성

npx sequelize model:generate --name Member --attributes name:string,team:string,position:string,emailAddress:string,phoneNumber:string,admissionDate:date,birthday:date,profileImage:string 

/migrations 디렉토리에 (생성일자 및 시간)-create-member.js 파일이 생성된다.

  • 데이터베이스에 Members 테이블을 생성하는 코드가 담겨있는 파일이다

  • id 프로퍼티(컬럼)를 sequelize-cli 가 자동으로 코드에 추가해준다.

  • createdAt, updatedAt 프로퍼티도 기본으로 생성되는데, defaultValue 속성을 추가할 수 있다.

    // /migrations/(생성일자 및 시간)-create-member.js
    
    // ...      
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
            defaultValue: Sequelize.fn('now') // 현재 시간으로 기본값을 설정하는 함수
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
            defaultValue: Sequelize.fn('now')
          }
    // ...

/models 디렉토리에 member.js 파일이 생성된다.

  • 나중에 Members 테이블을 제어하기 위해 연동해서 사용할 Member 모델의 코드가 담겨있는 파일

7. 데이터베이스에 Members 테이블 생성

npx sequelize db:migrate

/migrations 디렉토리에 있는 모든 마이그레이션 파일들의 내용을 파일명에 있는 '생성일자 및 시간' 순서대로 수행하는 명령이다.

8. Members 테이블에 넣을 seed 데이터 생성

npx sequelize seed:generate --name initialMembers

Members 테이블에 넣을 seed 데이터 삽입 코드가 있는 initialMembers라는 이름의 파일을 생성한다.

  • /seeders 디렉토리 안에 (생성일자 및 시간)-initialMembers.js 파일이 생성된다.

파일 코드에 실제로 넣을 seed 데이터에 해당하는 JSON 형식의 직원 정보 배열 추가 후,

npx sequelize db:seed:all

위 명령어로 Members 테이블에 Seed 데이터 추가한다.

9. Member 모델 코드에 빠져있는 id 프로퍼티 추가

// models/member.js

'use strict';
const { Model } = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class Member extends Model {} // sequelize 의 Model 클래스를 확장해서 Member Model 이 된다.
  Member.init(
    {
      id: { // /migrations/(생성일자 및 시간)-create-member.js 에서 id 프로퍼티를 가져와서 추가한다.
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER, // moduel.exports 의 두 번째 인자로, sequelize.DataTypes.INTEGER 과 동일하다. 
      },
      name: DataTypes.STRING,
      team: DataTypes.STRING,
      position: DataTypes.STRING,
      email: DataTypes.STRING,
      phoneNumber: DataTypes.STRING,
      admissionDate: DataTypes.DATE,
      birthday: DataTypes.DATE,
      profileImage: DataTypes.STRING,
    },
    {
      sequelize,
      modelName: 'Member',
    },
  );
  return Member;
};
// models/index.js

const Sequelize = require('sequelize');
const config = require('../config/config.json');

// config.json 에서 가져온 값으로 sequelize 인스턴스를 만든다.
const { database, username, password, host, dialect } = config.development;
const sequelize = new Sequelize(database, username, password, {
  host,
  dialect,
});

// 위 member.js 의 첫 번째 인자로 sequelize 인스턴스 객체, 두 번째 인자로 DataTypes 객체를 넘겨서 Member 모델을 만든다.
const Member = require('./member')(sequelize, Sequelize.DataTypes);

const db = {};
db.Member = Member; // 다른 모델들도 추가될 수 있으므로 db 객체에 담아서 exports 한다.

module.exports = db;

10. db에서 Member 모델 가져와서 사용하기

const express = require('express');

const app = express();

const db = require('./models'); // ./models/index.js 에서 exports 한 db를 꺼내온다.
const { Member } = db;
profile
React, Next.js, TypeScript 로 개발 중인 프론트엔드 개발자

0개의 댓글