-
[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
이제 다시 실행시켜보자.
정상적으로 테이블이 추가되었다!