Node

Node.js에서 ORM 사용하기 (sequelize 기본 설정 하기)

citron031 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