POSCOxCODINGON 웹 풀스택 13기

[ 코딩온 ] KDT 웹 풀스택 13기 / 7월 3주차 회고 / Sequelize 폴더 구조

write3027 2024. 7. 16. 12:28

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의 환경변수까지 사용하면서 매우 복잡하게 느껴진다.

하지만 파일별로 구조와 기능이 나눠져 있어서 전체적인 구조를 정확하게 이해하고 나면 사용 및 유지보수가 용이할 것 같긴 하다.

이론을 공부하는 것보단 실습을 많이 해보는것이 코드와 파일구조를 이해하는데 도움이 될 것 같다.