ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [EXPRESS] MySQL, 시퀄라이즈 설치부터 Node 연결까지!
    Node, Express 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

    이제 다시 실행시켜보자.

     

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

Designed by Tistory.