[EXPRESS] MySQL, 시퀄라이즈 설치부터 Node 연결까지!
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
이제 다시 실행시켜보자.
정상적으로 테이블이 추가되었다!