ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #Sequelize 그것이 알고 싶다. Sequelize 이론부터 연결까지 1편
    Node.js 2023. 11. 19. 16:49

    # Sequelize란?

    Sequelize는 Node.js에서 사용할 수 있는 Promise 패턴 기반의 ORM(Object Relational Mappin) 라이브러리입니다. ORM은 데이터베이스와의 상호작용을 좀 더 추상화하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 다룰 수 있게 해줍니다. Sequelize는 주로 관계형 데이터베이스(예: PostgreSQL, MySQL, SQLite 등)와 함께 사용됩니다. 

    Sequelize를 사용하면 자바스크립트로 mysql을 제어할 수 있습니다.

    # Sequelize 설치

    ** 터미널을 열어서 sequelize를 사용하기 위해 아래 3가지 패키지를 명령어로 설치해줍니다. 

    $ npm i sequelize mysql2
    $ npm i -D sequelize-cli

     

    1. Squelize는 Node.js에서 사용할 수 있는 ORM(Object-Relational Mapping) 라이브러리 입니다. 이를 통해 JavaScript 코드로 SQL데이터베이스를 쉽게 조작할 수 있습니다. 

     

    2. mysql2 패키지는  Sequelize가 MySQL 데이터베이스와 상호작용할 수 있도록 도와주는 MySQL 클라이언트입니다. Seqelize는 다양한 데이터베이스 유형과 호환되지만, MySQL을 사용할 때 mysql2 패키지가 설치되어 있어야 합니다. Sequelize는 이를 의존성으로 가지고 있어야 정상적으로 MySQL 데이터베이스와 상호작용할 수 있습니다. 

     

    3. sequelize-cli은 Sequelize Command Line Interface의 약자로, Sequelize 프로젝트를 더 쉽게 관리하고 데이터베이스 마이그레이션, 시딩 등을 할 수 있도록 도와주는 도구입니다.  이는 Sequelize 프로젝트를 관리하고 데이터베이스 스키마를 관리하는데 유용합니다. 

     

    정리하면, Sequelize는 데이터베이스와 상호작용할 수 있는 ORM이고, mysql2는 Sequelize가 MySQL과 상호작용할 수 있도록 도와주는 패키지입니다. sequelize- cli는 Sequelize 프로젝트를 관리하고 데이터베이스 관련 작업을 쉽게 수행할 수 있도록 도와주는 Command Line Interface 도구입니다. Sequelize를 MySQL과 함께 사용할 때에는 mysql2 패키지가 필요하며, sequelize-cli은 Sequelize 프로젝트 관리를 위한 보조 도구 입니다.   

     


     

    ** 위에 3가지 패키지가 설치 완료되면, 아래와 같이 터미널에서 명령어로 초기화해줍니다.

    npx sequelize init

     

     

    ** 초기화를 시키면 config, models, migrations, seeders와 같은 폴더들이 생깁니다. 

    .
    -- README.md
    |-- config
    |    `-- config.json
    |-- migrations
    |-- models |
          `-- index.js
    |-- package.json
    |-- seeders


    * config

    데이터베이스 연결 설정과 관련된 파일이 위치합니다. 이 파일에는 데이터베이스 연결 정보, 호스트, 사용자명, 암호 및 Sequelize 구성과 관련된 기타 옵션을 포함합니다. 

     

    * models

    `models` 폴더에는 Sequelize 모델들이 위치합니다. 각 모델은 데이터베이스의 각 테이블과 매핑되며, 데이터베이스 테이블의 구조, 관계, 유효성 검사 규칙 등을 정의합니다. 즉, 모델을 사용하기 위한 파일이라고 생각하시면 됩니다.

     

    * migrations

    데이터베이스 스키마의 버전 관리를 위한 폴더입니다. 각 마이그레이션 파일은 데이터베이스 스키마 변경을 정의하며, 새로운 테이블 생성, 칼럼 추가, 제거, 수정 등과 같은 스키마 변경을 관리합니다. 각 마이그레이션 파일은 반드시 일련의 변경사항을 정의하고, `up`과 `down` 함수를 포함하여 이전 상태로 롤백할 수 있는 기능을 제공합니다. 

     

    * seeders

    데이터베이스 초기 데이터를 채우기 위한 파일을 담고 있는 폴더입니다. 개발 환경이나 테스트를 위해 초기 데이터를 데이터베이스에 추가할 때 사용됩니다. Seed 파일은 예제 데이터, 테스터 또는 기본 데이터를 생성하는데 사용됩니다. 

     


    # Sequelize 연결

    ** 자신의 MySQL 서버에 연결하기

    실제로 MySQL과 연결하기 위해선 config 파일에 안에 있는 config.json 값을 바탕으로 데이터베이스에 연결을 할 수 있습니다. MySQL과 연결하기 위해 다르게 설정해야 할 부분은 password, host(local이아닌 RDS로 받은 엔드포인트 주소) 두가지를 수정해야 합니다. 

     

    기본적으로 `npx sequelize init`을 통해 생성되는 models - index.js 파일은 commonJS 문법으로 작성된 상태입니다. 저는 ESM 문법으로 작업을 진행하였기 때문에 전부 지우고 "development" 만 ESM 문법으로 작성하였습니다. 

     

    +++  node env를 통해 node를 시작할 때, 자신이 사용하는 node가 어떤 환경인지 설정을 해줄 수 있습니다.  Sequelize는 아무런 설정을 따로 하지 않으면 "development"로 선택되며,  "test" 혹은 "production"으로도 설정이 가능합니다. 여러가지 환경별로 DB를 연결할 때 설정을 해줄 수 있는 것입니다. 자신에게 해당하는 환경에 맞춰 config를 설정할 수 있다고 생각하면 됩니다. 

     

    +++ test 환경으로 연결하는 예시)

    NODE_ENV=test npx sequelize db:create

     

    수정 전, commonJS 문법의 index.js 파일

    {
      "development": {
        "username": "root", // USERNAME을 'root'로 지정했기 때문에 변경할 필요x
        "password": null, // 사용하는 password로 변경
        "database": "database_development",
        "host": "127.0.0.1", // localhost가 아닌 AWS -> RDS로 발급받은 엔드포인트 주소를 입력
        "dialect": "mysql"
      },
      "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql"
      },
      "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql"
      }
    }

     

    수정 후, ESM 문법으로 다시 작성한 index.js 파일

    import Sequelize from 'sequelize';
    import * as configEX from '../config/config.js';
    
    // 환경변수에 따라 config를 설정
    const env = process.env.NODE_ENV || 'development';
    const config = configEX[env];
    const db = {};
    
    // db 객체에 sequelize 객체를 저장
    const sequelize = new Sequelize(config.database, config.username, config.password, config);
    db.sequelize = sequelize;
    
    export default db;

    ** app.js에서 실제로 데이터베이스가 연결되었는지 확인하기

    // DB연결 확인하기
    const SERVER_PORT = process.env.PORT || 3000; // const SERVER_PORT = 3000;
    
    const { sequelize } = db;
    sequelize
      .sync({ force: false })
      .then(() => {
        console.log('데이터베이스 연결 성공');
      })
      .catch((error) => {
        console.log('데이터베이스 연결 실패: ', error);
      });
    
    app.listen(SERVER_PORT, () => {
      console.log(SERVER_PORT, '포트로 서버가 열렸습니다.');
    });

     

    'Node.js' 카테고리의 다른 글

    #Node.js // bcrypt 모듈 암호화 사용 방법을 알아보자  (0) 2023.11.16
Designed by Tistory.