ABOUT ME

Today
Yesterday
Total
  • [Express] Sequelize를 이용해 모델(테이블) 생성 및 접근하기
    Others 2021. 9. 28. 23:01

    이전 게시물에서 Express에 무사히 Sequelize를 설치 및 설정하였다.

    이제 나의 로컬 컴퓨터의 MySQL 데이터베이스에 접근을 했으니, 테이블에 접근을 해야할 차례이다.

     

    Table에 접근하기

    현재 Sequelize에서 접근하고 있는 데이터베이스에 어떤 Table이던 모델 선언을 해주지않으면 Sequelize에서 사용할 수 없다.

     

    예시를 들기 위해서 위와 같이 User라는 테이블에 대해 접근한다고 가정하자.

    모델을 선언하기 위한 폴더(models)에 User.js 파일에 아래와 같이 작성했다.

    // /db/models/User.js
    
    module.exports = (sequelize, DataTypes) => {
    	// User 테이블의 속성들에 대한 선언
        const tableAttrs = {
            id: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                autoIncrement: true,
                allowNull: false,
            },
            name: {
                type: DataTypes.STRING(10),
                allowNull: false,
                unique: true,
            },
            age: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
        }
        
        // table 속성에 대한 선언
       	const configOptions = {
            charset: "utf8",
            collate: "utf8_general_ci",
            freezeTableName: true,
            timestamps: false,
            underscored: true,
            tableName: "User",
        };
    	
        // User 테이블 접근 및 모델 생성
        const User = sequelize.define(
            "User",
            tableAttrs,
            configOptions,
        );
        return User;
    };
    • User.js 모듈의 함수를 통해 Sequelize 본체를 매개변수로 넘겨주고 모델을 받는 형식이다.

     

    너무 많은 정보가 있지만, 정리해보도록 하자

    sequelize.define

    이 함수는 데이터베이스의 Table 스키마에 대응되는 Model을 반환한다.

     

    • 첫번째 파라미터

    Sequelize에서 사용할 Model의 이름을 넘겨주어 정의할 수 있다.

     

    • 두번째 파라미터

    실제 데이터베이스의 Table에 대한 속성들을 가져올(선언할) 수 있는 부분이다.

    tableAttr 변수처럼 테이블의 속성에 대응하도록 선언하자.

     

    type : 데이터 타입을 지정 (sequelize의 모듈에서 가져온다)
    primaryKey : 기본키 설정 (default: false)
    autoIncrement : 키 자동 상승 (default: false)
    allowNull : Null을 허용할 것인지 (default: true)
    unique : unique 속성인지 (default: false)
    comment : column에 대한 comment
    validate : 각 column에 대한 validation check옵션을 넣어준다.

     

     

    • 세번째 파라미터

    Module과 Table에 대한 설정 값을 지정하여 모듈을 컨트롤 할 수 있다.

    다음과 같은 옵션들을 적용할 수 있다.

    # timestamps
    Sequelize는 테이블을 생성한 후 자동적으로 createdAt, updatedAt column을 생성한다.
    Database에 해당 테이블이 언제 생성되었고 가장 최근에 수정된 시간이 언제인지
    추적할 수 있도록 해준다.
    기능을 끄려면 false로 설정한다.
                 
    # paranoid
    paranoid가 true이면 deletedAt column이 table에 추가된다.
    해당 row를 삭제시 실제로 데이터가 삭제되지 않고 deletedAt에 삭제된 날짜가 추가되며
    deletedAt에 날짜가 표기된 row는 find작업시 제외된다.
    즉 데이터는 삭제되지 않지만 삭제된 효과를 준다.
    timestamps 옵션이 true여야만 사용할 수 있다.
                
    # underscored
    true이면 column이름을 camalCase가 아닌 underscore방식으로 사용한다.
    
    # freezeTableName
    Sequelize는 define method의 첫번째 파라미터 값으로 tablename을 자동변환하는데
    true이면 이작업을 하지 않도록 한다.
    
    # tableName
    실제 Table name
    
    # comment
    table 에 대한 comment

     

     

    모델을 위와 같이 선언했으면, Sequelize에서 Module을 가질 수 있어야 한다.

    Sequelize.js 파일을 다음과 같이 수정하여 적용하였다

    const Sequelize = require('sequelize');
    
    const env = process.env.NODE_ENV || 'development';
    const config = require('./config.json')[env];
    const sequelize = new Sequelize(config.database, config.username, config.password, config);
    
    const db = {};
    
    db.User = require('./models/User')(sequelize, Sequelize);
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    
    module.exports = db;

     

    다음과 같이 설정하고 실행을 하면 다음 문구가 실행된다.

    보이다 싶이 CREATE TABLE IF NOT EXISTS SQL 문이기 때문에 MySQL에 테이블이 없다면 테이블을 생성하고 있다면 무시하고 모듈로 가져온다.

    MySQL을 확인하면 다음과 같이 테이블을 생성된 것을 볼 수 있다.

     

     

    참고

     

    [ORM] Sequelize , 자동 테이블 생성 및 DB 접근

    ORM이란? ORM(Object Relational Mapping)은 application과 Database사이를 맵핑시켜주는 도구이다. 한층더 추상화된 layer에서 Database에 대한 작업을 할 수 있게 해준다. ORM을 사용함으로써 얻는 장단점(pros..

    3dmpengines.tistory.com

     

    'Others' 카테고리의 다른 글

    Slack에 Github 알림 / Github Actions 연동하기  (2) 2021.11.07
    [Express] Sequelize 설치 및 설정하기  (0) 2021.09.28
Designed by Tistory.