2024.07.15 월
이번시간에는 Model파일에 Mysql 구조를 맵핑하는 방식이 아닌
Sequelize를 이용해 Model에서 직접 테이블을 생성하는 방법을 배웠다.
전반적인 흐름은 지난시간에 배운 MVC - MySQL연결하는 것과 비슷하다.
하지만 Sequelize를 사용하면 Model부분과 Controller부분이 바뀌고, 몇 개의 폴더가 추가된다.
이번 포스팅에는 Sequelize 폴더 구조와 추가로 필요한 폴더까지 정리해 보려고 한다.
Sequelize란?
- Node.js에서 사용할 수 있는 강력한 ORM(Object-Relational Mapping) 라이브러리.
- 데이터베이스 테이블을 정의하기 위해 모델을 사용한다.
- 데이터베이스에 대한 CRUD를 Controller에서 손쉽게 수행할 수 있다.
Sequelize 설치
npm init -y // package.json 설치
npm i sequelize sequeize-cli mysql2
npx sequelize init // 폴더 초기화. 1회성 실행이라 npm이 아닌 npx사용.
Sequelize 폴더 구조
: npx sequelize init 실행시 생성되는 디렉토리
1. config 디렉토리 :
- config/config.json.
- 데이터베이스 설정 파일. 데이터베이스 연결 정보 (db이름, 사용자 이름, 비밀번호) 등을 설정한다.
2. models 디렉토리 :
- models/index.js
- 모델들을 관리하는 파일. 이 파일은 Sequelize 인스턴스를 초기화하고, 다른 모델파일을 불러와서 연결한다.
3. migrations 디렉토리 : 데이터베이스 마이그레이션 파일들을 저장하는 디렉토리.
4. seeders 디렉토리 : 초기 데이터 시딩을 위한 파일들을 저장하는 디렉토리
dotenv란?
- Node.js에서 환경변수를 쉽게 관리할 수 있도록 도와주는 라이브러리.
- '.env'파일에 환경변수를 정의하면, config에서 쉽게 불러와 사용할 수 있다.
- 민감한 정보(db 비밀번호 등)을 코드에서 분리할 수있어 보안에 도움이 된다.
- cross-env와 함께 사용(package.json에서 사용)하여 환경변수를 설정하고 로드할 수 있다.
dotenv, cross-env 설치
npm i dotenv cross-env
'.env', 'config/config.json', 'models/index.js' 사용법
*env를 사용하기 위해 confing.json-> config.js로 확장자를 바꿔줘야 한다.
//.env
//config.js에서 사용할 환경변수 정의.
DBUSER= //Mysql 계정이름(root는 안됨)
PASS= //비밀번호
DATA= //develop버전으로 사용할 db이름
HOST=localhost
NEWDATA= //production버전으로 사용할 db이름
//config/config.js
const dotenv = require('dotenv')
dotenv.config();
module.exports = {
development : {
username : process.env.DBUSER,
password : process.env.PASS,
database : process.env.DATA,
host : process.env.HOST,
dialect : 'mysql'
},
production : {
username : process.env.DBUSER,
password : process.env.PASS,
database : process.env.NEWDATA,
host : process.env.HOST,
dialect : 'mysql'
}
}
//models/index.js
//Mysql을 맵핑하지 않고, config에 정의한 db정보를 가져와 테이블을 만들어서 사용.
'use strict';
//엄격모드(strict mode)활성화.
//JavaScript의 일부 비정상적이거나 오류가 발생할 가능성이 높은 동작을 변경하고,
// 보다 안전하고 예측 가능한 코드를 작성하도록 돕는 기능.
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
//process.env로 환경변수에 접근한다.
//NODE_ENV 환경변수에 정의된 실행환경을 env변수에 할당. ->NODE_ENV는 package.json에 정의
//process.env.NODE_ENV가 정의되어 있지 않으면 'development'를 설정.
const config = require(__dirname + '/../config/config.js')[env];
//env변수에 할당된 버전으로 config.js파일의 객체를 config변수에 할당.
const db = {};
let sequelize = new Sequelize(config.database, config.username, config.password, config);
db.User = require('./user')(sequelize); //model/user.js파일을 User라는 객체변수로 db에 정의
//model/user.js : user테이블의 컬럼 정의
db.Post = require('./post')(sequelize); //model/post.js파일을 Post라는 객체변수로 db에 정의
//model/post.js : post테이블의 컬럼 정의
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
package.json
: 개발 및 배포환경을 효율적으로 관리하기 위해 cross-env를 사용한다.
//package.json
{
"scripts": {
"start:dev" : "cross-env NODE_ENV=development nodemon server.js",
"start:prod" : "cross-env NODE_ENV=production nodemon server.js"
}
}
development 환경에서 실행 ->> npm run start:dev
production 환경에서 실행 ->> npm run start:prod
npm run start ->> development로 실행된다.
[정리]
.env :
환경변수 설정을 관리.
cross-env와 함께 사용하여 로컬 개발환경에서 환경변수를 설정하고 로드할 수 있다.
config/config.js :
데이터베이스 연결 정보 정의.
여러 환경(개발, 테스트, 프로덕션)에 따라 다른 설정을 관리할 수 있다.
models/index.js :
테이블 구조가 정의된 다른 모델파일들 관리.
모델을 로드하고 초기화하는 진입점 역할.
sequelize를 사용하면서부터는 models/index.js, config, 다른 model파일 등 많은 파일이 생기고,
dotenv와 cross-env의 환경변수까지 사용하면서 매우 복잡하게 느껴진다.
하지만 파일별로 구조와 기능이 나눠져 있어서 전체적인 구조를 정확하게 이해하고 나면 사용 및 유지보수가 용이할 것 같긴 하다.
이론을 공부하는 것보단 실습을 많이 해보는것이 코드와 파일구조를 이해하는데 도움이 될 것 같다.
'POSCOxCODINGON 웹 풀스택 13기' 카테고리의 다른 글
[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 4주차 회고 / aws (1) | 2024.07.24 |
---|---|
[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 3주차 회고 / 비밀번호 암호화 (0) | 2024.07.19 |
[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 2주차 회고 / MVC - MySQL 연결 (0) | 2024.07.14 |
[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 2주차 회고 / MVC(MySQL 연결x) (0) | 2024.07.11 |
[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 2주차 회고 / MySQL : JOIN (0) | 2024.07.10 |