본문 바로가기

JavaScript/Express.js

[Express.js] Database 연결하기 (Mysql, Sequelize)

1. DB 세팅

  • 'node_study' 이름의 데이터 베이스를 생성합니다
CREATE DATABASE node_study

 

2. Sequelize 세팅

     - JS의 객체와 DB의 릴레이션을 매핑 해주는 ORM(object-relational mapping)이다.
     - JS 구문을 알아서 SQL로 바꿔준다.

 

  • 패키지 설치
     - sequelize          : 시퀄라이즈 패키지
     - sequelize-cli     : 시퀄라이즈 명령어를 실행하기 위한 패키지
     - mysql2             : mysql과 시퀄라이즈를 이어주는 드라이버
$ npm install sequelize sequelize-cli mysql2

 

  • Sequelize CLI 초기화
     - 패키지 설치 후 seqeulize init 명령어를 호출한다.
       (npx : 패키지의 최신버전 파일을 불러와 설치하여 실행시키고 실행된 이후에 해당 패키지를 제거하는 방식)

     - 이후 config, models, migrations, seeders 폴더가 자동으로 생성 된다.
$ npx sequelize init

Sequelize CLI [Node: 20.11.0, CLI: 6.6.2, ORM: 6.35.2]

Created "config\config.json"
Successfully created models folder at ...
Successfully created migrations folder at ...
Successfully created seeders folder at ...

 

  • model/index.js 수정
// model/index.js

const Sequelize = require("sequelize");

const env = "development";
const config = require("../config/config")[env];
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;

module.exports = db;

 

  • MySQL 연결하기
// app.js

const express = require("express");
const { sequelize } = require("./models");

const app = express();

app.set("port", 3000);

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("DB 연결 성공");
  })
  .catch((err) => {
    console.log(err);
  });

app.listen(app.get("port"), () => {
  console.log(`Server On Port ${app.get("port")}`);
});
// config/config.js

{
  "development": {
    "username": "[database username]",
    "password": "[username에 해당하는 password]",
    "database": "node_study",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
...
}

 

  • 서버 실행
     - 아래 두 로그가 뜨면 연결에 성공한 것입니다.
$ npm start

> one-node-study@1.0.0 start
> nodemon app

[nodemon] 3.0.3
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node app.js`
Server On Port 3000
Executing (default): SELECT 1+1 AS result
DB 연결 성공

 

 

3. Model 정의

     - DB에서 저의한 테이블을 시퀄라이즈에서도 정의 해야한다 (Model)
     - Model에 따라 Table이 자동으로 생성되며 연결된다.

  • 만들고자 하는 table
CREATE TABLE user(
	id INTEGER PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(40) NOT NULL,
	password VARCHAR(40) NOT NULL,
	name VARCHAR(20) NOT NULL
)

 

  • User 모델 정의
     -  init 메서드              : 테이블에 대한 설정
     - associate 메서드    : 다른 모델과의 관계
// model/user.js

const Sequelize = require("sequelize");

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      // ** 테이블 컬럼에 대한 설정 (init의 첫 번째 인수)
      {
        username: {
          type: Sequelize.STRING(40),
          allowNull: false,
        },
        password: {
          type: Sequelize.STRING(40),
          allowNull: false,
        },
        name: {
          type: Sequelize.STRING(20),
          allowNull: false,
        },
      },
      // ** 테이블 자체에 대한 설정 (init의 두 번째 인수)
      {
        sequelize,
        charset: "utf8",			// 한글 사용을 위한 설정
        collate: "utf8_general_ci",		// 한글 사용을 위한 설정
        tableName: "user",			// 생성할 테이블 명
        modelName: "User",			// 모델 이름
        underscored: true,			// true: 스네이크 케이스 사용 / flase: 캐멀 케이스 사용
        timestamps: false,              	// create_at, update_at 생성 여부
      }
    );
  }
  static associate(db) {}
};

 

  • Model 호출
     - db 객체에 모델 담기
     - 각 모델의 init 메서드 호출
// model/index.js

const Sequelize = require("sequelize");
const User = require("./user");

const env = "development";
const config = require("../config/config")[env];
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;

// ** db 객체에 User Model 담기
db.User = User;

// ** User init 메서드 호출
User.init(sequelize);

module.exports = db;

 

  • 서버 실행
     - 아래와 같이 로그가 뜬다면 잘 생성이 된 것이다.
     - sequelize는 자동으로 id를 생성해준다.
$ npm start

...
Server On Port 3000
Executing (default): SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'user' AND TABLE_SCHEMA = 'node_study'
Executing (default): CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER NOT NULL auto_increment , `username` VARCHAR(40) NOT NULL, `password` VARCHAR(40) NOT NULL, `name` VARCHAR(20) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
Executing (default): SHOW INDEX FROM `user` FROM `node_study`
DB 연결 성공

 

 

github: https://github.com/DongyangOne/one-node-study/tree/master/database_setting