ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js에서 ORM 사용하기 (sequelize 기본 설정 하기)
    Node 2023. 3. 23. 23:09

    ORM, Object-Relational Mapping 은 model을 기술하는 도구이다.

    ORM을 통하여 SQL query문을 직접 작성하지 않고, 프로그래밍 언어를 통해서 Model에 접근할 수 있다.

    이렇게, 프로그래밍 언어의 관점에서 Model에 접근할 수 있는 까닭은, ORM이 대신 프로그래밍 언어를 SQL query문으로 변환해주기 때문이다.
    🏁 데이터베이스와 프로그래밍 언어 사이의 개념의 간극을 좁힌다.

    ORM은 entity나 record를 객체나 클래스를 다루듯이 접근할 수 있게 한다.
    🍙 ORM을 통해서 객체에서의 각 속성은 데이터베이스에서 필드를 의미하게 된다.

    각 언어마다 사용할 수 있는 ORM API가 있다.

    • 자바에서는 JDBC(Java Database Connectivity)
    • 자바스크립트(Node.js)에서는 sequelize
    • 파이썬에서는 SQLAlchemy나 장고 내부의 ORM이 있다.
      🥠 이러한 ORM은 여러가지 RDBMS를 지원하는데, 단순하게 어뎁터 설정만 바꾸면 ORM은 같은 프로그래밍 언어 코드를 각 DB에 알맞은 query문으로 변형시켜준다.
      🍧 즉, 사용하는 데이터베이스가 중간에 바뀌어도 어뎁터 설정만 바꾸면 기존의 코드를 그대로 사용할 수 있다.

    자바스크립트에서는 대표적인 ORM으로 Sequelize, TypeORM, Prisma가 있다.

    😄 그중에서 sequelize를 한 번 사용해보기로 하였다.

    🥡 sequelize의 특징

    • sequelize은 PostgreSQL, MySQL, MariaDB, SQLite, MS SQL Server 등의 RDBMS를 지원한다.
    • 사용하고자 하는 RDBMS의 어뎁터를 사용하면, 호환성 문제는 고려하지 않아도 된다.
    • join table을 구현하기 위해서 Association을 고려할 수 있다.
      🧉 HasOne, Belongsto, HasMany와 BelongsToMany 와 같은 매소드를 사용하여 1:N, M:N Mapping을 할 수 있다.
    • 데이터베이스의 롤백과 커밋을 위해서 Transaction을 정의한다.
      🍵 일련의 작업 단위로 이루어져야 롤백할 수 있다. 하나하나 쿼리의 조합을 하나의 작업 단위로 보고 에러시 롤백, 성공하면 커밋한다.

    sequelize 설치하기 (with mysql)

    npm install sequelize sequelize-cli mysql2

    설치가 끝나면, 다음과 같은 명령어로 기본 설정을 할 수 있다.

    sequelize-cli가 설치되어있어야 sequelize 명령어를 사용할 수 있다.

    npx sequelize init

    해당 명령어를 실행하면 config, migrations, models, seeders 폴더가 새로 생긴 것을 확인할 수 있다.

     

    config 폴더 내부에 config.json 파일이 있는데 development, test, production 각각의 환경에서 사용할 db에 대한 설정을 확인할 수 있다.

    설치한 데이터베이스의 드라이버로 연결되므로, 여기에서는 mysql과 연결되어 있는 것을 확인할 수 있다.

    사용할 db 계정과 비밀번호, 데이터베이스의 이름을 수정하자.

    {
      "development": {
        "username": "root",
        "password": null,
        "database": "database_development",
        "host": "127.0.0.1",
        "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"
      }
    }

    해당 이름의 db가 없다는 에러 메세지가 나타나면 다음과 같은 명령어로 db를 생성할 수 있다.

    npx sequelize db:create

    이제 models 폴더 내부에 테이블을 정의할 수 있다.

    예시로 user.js 파일을 만들어보자.

    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define("user", {
        name: DataTypes.TEXT,
        favoriteColor: {
          type: DataTypes.TEXT,
          defaultValue: 'green'
        },
        age: DataTypes.INTEGER,
        cash: DataTypes.INTEGER
      });
      User.associate = (db) => {
        // 이곳에서 데이터간의 관계를 정의할 수 있다.
        // ex. db.User.hasMany(db.Post);
      };  
      return User;
    };

    그리고 다음과 같이 프로젝트 최상위 폴더에 index.js를 만들고 node index.js로 이를 실행한다.

    const db = require("./models");
    
    db.sequelize
      .sync()
      .then(() => {
        console.log("db connected !!");
      })
      .catch(console.error);

    터미널에 db connected !! 메세지를 확인할 수 있고,

    mysql에서는 users라는 이름으로 테이블이 생긴 것을 확인할 수 있다.

     

    이제 다음과 같이 db에 접근하여 데이터를 쓰고 가져올 수 있다.

    const { user } = require("./models");
    
    const initTest = async () => {
      const createdUser = await user.create({
        name: "park",
        age: 35,
        cash: 30000,
      });
      console.log("createdUser", createdUser);
      const findUser = await user.findOne({
        where: { name: "park" },
      });
      console.log("findUser", findUser);
    };
    
    initTest();

    주의해야할 점은 models의 index로 부터 테이블을 가져와야 한다는 점이다.

    models의 index에서 다른 테이블들을 가져온 뒤 실행하여 관계를 연결하고 이를 db 객체에 담아 다시 반환해주기 때문이다.

    위의 코드를 실행한 결과를 확인하면, 실제 mysql에 데이터가 쓰여진 것을 확인할 수 있다.

     

    https://sequelize.org/docs/v6/getting-started/

     

    Getting Started | Sequelize

    In this tutorial you will learn to make a simple setup of Sequelize.

    sequelize.org

Designed by Tistory.