JavaScript/Express.js
[Express.js] Database 연결하기 (Mysql, Sequelize)
rlawnaks
2024. 1. 30. 16:04
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