Node, Express

[EXPRESS] MySQL, 시퀄라이즈 설치부터 Node 연결까지!

재원쓰 2023. 4. 21. 23:37

MySQL 설치 및 실행

맥에서는 Homebrew를 통해 MySQL을 설치하는 것이 좋다. Homebrew는 다음 명령어로 설치할 수 있다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrew 설치를 완료하고 나면 Homebrew를 통해 MySQL을 설치한다.

$ brew install mysql
$ brew services start mysql
$ mysql_secure_installation

설치 후 brew services start mysql 명령어로 MySQL을 시작하고 mysql_secure_installation 명령어로 root 비밀번호를 설정한다. validate_password 플러그인을 설치할 것인지를 물으면 모두 n을 입력하고 Enter를 눌러 건너뛴다. 나중에 실제 서버를 운영할 때는 설정해주는 것이 보안상 좋다.

 

비밀번호까지 설정했다면 MySQL에 접속해보자.

$ mysql -h localhost -u root -p
Enter password: [비밀번호 입력]
mysql>

시퀄라이즈, MySQL2 설치

MySQL2

node와 MySQL을 연결해주는 라이브러리

Sequelize(시퀄라이즈)

자바스크립트로 SQL을 조작할 수 있게 해주는 라이브러리. 시퀄라이즈를 사용하면 SQL 언어를 따로 배우지 않아도 된다.


시퀄라이즈와 MySQL2를 설치해준다.

$ npm i sequelize sequelize-cli mysql2

시퀄라이즈 세팅 명령어를 입력한다.

npx sequelize init

그럼 서버 디렉토리에 config, migrations, models, seeders 디렉토리가 생겼을 것이다.

config > config.json 으로 이동한다.

{
  "development": {
    "username": "root",
    "password": "🔥생성한 MySQL 비밀번호",
    "database": "🔥수정할 데이터베이스 명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "🔥수정할 데이터베이스 명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "🔥수정할 데이터베이스 명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

코드를 살펴보면 "development(개발용)", "test(테스트용)", "production(배포용)"으로 나누어져 있다.

보통 데이터베이스를 개발용, 테스트용, 배포용을 따로 두기 때문에 각각 환경변수 별 설정이 나누어져 있는 것이다. 


시퀄라이즈로 Node와 mySQL을 연결

models > index.js 로 이동한다.

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (
      file.indexOf('.') !== 0 &&
      file !== basename &&
      file.slice(-3) === '.js' &&
      file.indexOf('.test.js') === -1
    );
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

 

코드가 옛날버전이라서 다시 작성해줄 것이다. 맨 위부터 fs 어쩌구 부분까지 통째로 날려준다.

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

 

날려준 윗 부분을 다시 작성해준다.

const Sequelize = require("sequelize");

// 1. 개발환경을 기본값인 development 로 설정한다.
const env = process.env.NODE_ENV || 'development';
// 2. 데이터베이스 설정했던 config 파일의 "development" 설정을 가져온다. 
const config = require('../config/config.json')[env] // ([env]는 "development")
// 3. db 에 빈객체를 일단 생성한다.
const db ={}

// 4. 시퀄라이즈에 config(설정)에 있는 데이터베이스명, 유저네임, 패스워드를 가져와서 등록한다.
const sequelize = new Sequelize(config.database, config.username, config.password, config)

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

 

여기까지 시퀄라이즈가 node와 mySQL을 연결해주는 과정이다.
연결이 성공하면 시퀄라이즈 객체에 연결 정보가 담겨있다.

이제 테이블을 만들어주면 된다!

 


테이블 만들고 나서 연결하기

만들어진 테이블을 index에 연결시켜준다.

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

// 🔥 추가되는부분 
// comment.js를 보면 module.export = (sequelize, DataTypes) => {} 👈 이런 형태이다.
// 저 매개변수 자리에 sequelize, Sequelize를 집어넣어주면 👇 코드가 만들어진다.
db.Comment = require("./comment")(sequelize, Sequelize); 
db.Hashtag = require("./hashtag")(sequelize, Sequelize); 
db.Image = require("./image ")(sequelize, Sequelize); 
db.Post = require("./post")(sequelize, Sequelize); 
db.User = require("./user")(sequelize, Sequelize); 


Object.keys(db).forEach((modelName) => {
    if (db[modelName].associate) {
        db[modelName].associate(db)
    }
})

 

그리고

Object.keys(db).forEach((modelName) => {...}

이 부분은 각 테이블의 associate 부분(관계 맺는 부분) 실행시켜주는 로직이다.

 


본체에 시퀄라이즈 연결

모든 테이블 정의가 끝났다. 이제 본체인 app.js에 DB와 시퀄라이즈를 연결해줄것이다. db를 불러오고 db의 시퀄라이즈를 실행시켜 연결을 한다.

const express = require("express")
const postRouter = require("./routes/post")
const db = require("./models") //🔥 추가 부분
const app = express()

//🔥 추가 부분
db.sequelize
    .sync()
    .then(() => {
        console.log("db 연결 성공")
    })
    .catch(console.error)

app.get("/", (req, res) => {...})

...

 


서버 실행과 DB에 테이블 추가

이제 서버를 실행해본다.

node app

그럼 이런 에러가 뜰 것이다. 

 

데이터베이스를 아직 안만들어주어서 그렇다. 아래 명령어를 입력하여 DB를 생성한다.

npx sequelize db:create

이제 다시 실행시켜보자.

 

정상적으로 테이블이 추가되었다!