웹 개발

[포스코X코딩온] Sequelize 사용법

끊임없이 성장중인 개발자 2023. 12. 4. 20:32
728x90
반응형

포스팅 주제

  • Sequelize

Sequelize란?

  • 자바스크립트 구문을 알아서 SQL로 변환해준다
  • DB작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리 중 하나
    • Object-Relation Mapping

 

 

Sequelize 설치 방법!

npm install sequelize sequelize-cli myslq2

 

이번 Sequelize에서는 몇개의 폴더가 달라지거나 추가된다.

 

* 기존에는 모델 폴더 안에 여러개의 파일이 있다면 데이터베이스 명을 바꾸게 된다면 모든 파일을 다 바꿔줘야 했다.

=> config.json 파일로 한번에 처리가 가능해졌다!!

 

새로 추가된 폴더들 

 

** config, models 폴더가 추가된 것을 확인 가능하다.

=> config 폴더의 파일은 .json 형식을 가진다.

 

< config.json >

{
    "development": {
        "username" : "user",
        "password" : "1234",
        "database" : "kdt",
        "host" : "127.0.0.1",
        "dialect" : "mysql"
    },
    "production" : {},
    "test" :{}
}

 

이곳에는 이전에 model에서 DB랑 연결 했듯이 이곳에서 DB와 연결이 가능하다.

host의 127.0.0.1은 localhost의 주소를 나태는 것으로 localhost와 같은 의미다.

 

여기서 development, production, test는 개발 환경을 말하고, 현재 여기서는 development만 사용하기 때문에 작성하지 않았다.

 

 

먼저 models를 설정해 준다.

< models : index.js >

 

// 전체 정보가 index에 있다.

const Sequelize = require('sequelize');
//[]을 붙여줘서 원하는 데이터베이스?를 가져온다
const config = require(__dirname + '/../config/config.json')['development'];

console.log('config >',config);
/**
 *  username: 'user',
    password: '1234',
    database: 'kdt',
    host: '127.0.0.1',
    dialect: 'mysql'
 */

const db = {};
// 시퀄라이즈 객체 선언시 매개변수로 다음 정보들을 받음
const sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
)
// console.log(sequelize);

// 데이터 베이스에 접근할 때 사용하는 orm을 만들기 위해

db.sequelize = sequelize;

db.Sequelize = Sequelize;

db.Visitor = require('./Visitor')(sequelize, Sequelize);
// models/Visitor.js에서 정의한 모델이 db.Visitor에 들어감
// db = { sequelize: sequelize, Sequelize: Sequelize, Visitor : ~~~}

module.exports = db;
// db라는 변수를 내보냄
// 시퀄라이즈 객체를 만들고 모듈로써 내보내서 "다른 파일에서 모두 같은 객체를 사용할 수 있게 함"

//이렇게 내보낸 db는 app.js에서 사용할 것이다.

 

const sequelize에 DB 정보들을 넣어준다.

db.sequelize = sequelize,

db.Sequelize = Sequelize를 해줘서 db를 만들어 준다.

 

db.Visitor 는 Visitor.js에서 정의 한다.

마지막으로 module.exports=db를 해서 다른 곳에서 db를 사용할 수있게 해준다.

 

< models : Visitor.js >

// TODO : visitor 모델 정의
// 테이블 구조를 정의한다 라고 생각
// 시퀄라이즈 모델이랑 mysql 테이블 연결
const Visitor = (Sequelize, DataTypes) => {
    // Sequelize는 models/index.js에서의 sequelize
    // DataTypes: models/index.js에서의 Sequelize

    const model = Sequelize .define(
        'visitor', // parma1 : 모델 이름 설정
        {
            // id int not null Primary key auto_increment
            id: {
                type: DataTypes.INTEGER,
                allowNUll: false,
                primaryKey: true,
                autoIncrement: true
            },
            name : {
                // name VARCHAR(10) NOT NULL
                type: DataTypes.STRING(10),
                allowNUll: false
            },
            comment: {
                // comment MEDIUMTEXT
                type: DataTypes.TEXT('medium')
            }
        }, // param2 : 칼럼 정의
        {
            tableName: 'visitor2', // 실제 DB 테이블 이름 명시
            freezeTableName: true, // 첫번째 인자로 넘겨준 모델 이름을 그대로 테이블 이름으로 고정
            //시퀄라이즈는 기본적으로 테이블 이름을 모델 + s로 가져간다.
            // charset, collate 값이 있는데 db정의할 때 한글 인코딩 가능하도록 만들었기 때문에 따로 설정 필요 X

            timestamps: false,
            // -- 데이터가 추가되고 수정된 시간을 자동으로 컬럼으로 만들어서 기록하는 옵션


        }// param3 : 모델 옵션 선택
    )
    return model;
}

module.exports = Visitor;

 

 Sequelize는 models/index.js에서의 sequelize
 DataTypes는 models/index.js에서의 Sequelize를 의미한다.

 

모델을 정의해줘야 한다.

여기서 'visitor'는 모델의 이름으로 테이블의 이름이 아니다.

 

모델을 정의할 때는 아래와 같은 방식으로 한다.

코딩온 교육자료

 

컬럼들은 아래 사이트에서 정의하는 법을 볼 수 있다.

https://sequelize.org/docs/v6/other-topics/other-data-types/

 

Other Data Types | Sequelize

Apart from the most common data types mentioned in the Model Basics guide, Sequelize provides several other data types.

sequelize.org

 

 

마지막 tableName은 새로 만들 테이블의 이름을 정의하는 것이다.

시퀄라이저는 기본적으로 테이블 이름을 모델 + S로 가져가는데 true로 설정하면 직접 입력한 테이블 이름을 사용한다.

 

timestamps는 데이터가 추가되고, 수정된 시간을 자동으로 컬럼으로 만들어 기록하는 옵션이다.

 

return model로 model을 리턴 받는다.

module.exports = Visitor를 사용하여 다른 곳에서 Visitor를 사용할 수 있게 만든다.

 

< app.js 설정 >

const express = require('express');
const app = express();
const PORT = 8000;

const db = require('./models/index');

app.set('view engine', 'ejs');
app.set('views', './views');

app.use('/static', express.static(__dirname + '/static'));

app.use(express.urlencoded({extended: true}));
app.use(express.json());

// // 라우터 분리
// const indexRouter = require('./routes/index');
// app.use('/', indexRouter);


// 애러 처리
app.get('*', (req,res) => {
    res.render('404');
})

db.sequelize.sync({force: false}).then(() => {

    //force: false => 테이블이 없으면 생성
    //force: true => 테이블 무조건 생성(만약 db가 있다면 삭제하고 다시 생성 -> prod에서 사용 x [사용자 정보 손실] )

    app.listen(PORT, () => {
        console.log(`${PORT} is opening!!`)
    })
})

 

db.sequelize.sync({force : false}).then(() = > {}

를 만들어서 force가 false면 테이블이 없으면 생성 옵션이고, true면 테이블을 무조건 생성하는 옵션이다.

 

만약 DB가 존재한다면 기존 DB를 지우니까 조심해야 한다.

 

 

 

반응형