티스토리 뷰

반응형

안녕하십니까

제가 이전 글에서 express에 mysql을 연결하는 것을 작성을 해봤는데, node js에서도 ORM(Object-Relational Mapping)

을 제공한다고 합니다.

 

간단히 소개하면 OOP와 DB같이 호환되지 않는 데이터를 변환하는 프로그래밍 기법이라고 할 수 있을까요?

객체를 이용한 DB와의 매핑(?)이라고 할 수 있을지 모르겠네요...

Google에 ORM이라 검색하면 정말 좋은 글들이 많이 있으니 한번 찾아보세요.

 

아무튼 객체를 이용해서 DB에 Data를 이용할 수 있게 해주는 거에요. Java에서는 JPA(Java Persistent API)라고 해서 Java에서 사용할 수 있는 ORM 기술에 대한 API 표준 명세를 의미하는 기술을 이용하며 그를 구현한 ORM 프레임 워크로 대표적으로 Hibernate가 있습니다.

 

그러면 node js에서는 어떠한 ORM 프레임워크를 이용할까요?

Sequelize가 대표적인 node js ORM 입니다. 

Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication and more.

Sequelize follows SEMVER. Supports Node v6 and above to use ES6 features.

 

뭐 보니 DB에 대한 틀 지원, 트랜잭션, 릴레이션, 레이지 로딩 등 지원하고 노드 v6이상부터 지원하며 ES6 기능을 사용한다고 하네요. (SEMVER)가 뭔지는 잘 모르겠습니다.)

 

Sequelize 홈페이지를 가보니 Getting started 부터해서 매뉴얼들이 잘 되어 있더라고요. 

저는 Mysql을 이용하기 때문에 Mysql을 이용하여 Connection을 해보겠습니다. 물론 Typescript도 입혀보고요.

 

우선 이렇게 두 가지를 설치해야 합니다.

npm install --save sequelize
npm install --save mysql2

그리고 저는 sequelize를 동시에 @types/sequelize를 설치해야 하는 줄 알았습니다.

하지만 Sequelize는 자체 TypeScript정의를 제공하며 TS>=3.1부터 지원된다 하네요.

 

그리고 수동으로 다음 세가지는 설치해야 한다고 합니다.

@types/node

@types/validator

@types/bluebird

 

Connection 자체는 너무 쉽게 설명이 되어 있네요.

 

import { Sequelize } from "sequelize";
export const sequelize = new Sequelize(
  config.db_server.database,
  config.db_server.user,
  config.db_server.password,
  {
    host: config.db_server.host,
    dialect: "mysql",
  }
);

끝입니다! 정말 쉽죠? 하지만 이렇게만 한다면 안되겠죠...ㅎㅎㅎ

저는 다음과 같은 옵션들을 넣어봤습니다. 

export const sequelize = new Sequelize(
  config.db_server.database,
  config.db_server.user,
  config.db_server.password,
  {
    host: config.db_server.host,
    dialect: "mysql",
    define: {
      timestamps: false  // Sequlize는 기본적으로 Sequelize는 애트리뷰트 
      					 // createdAt와 updatedAt모델을 추가하여 데이터베이스 엔트리가 언제 db에 들어 왔는지 그리고 마지막으로 업데이트 된시기를 알 수 있습니다.
    },
    timezone: "+09:00",  // DB Time과 맞춤
    pool: {				 // Connection pool
      max: 30,
      min: 0,
      acquire: 30000,
      idle: 10000
    }
  }
);

 

그리고 ORM을 사용하려면 Data를 넣고 받아올 객체를 만들어야 겠죠???

import { sequelize } from "../configure/connection";
import Sequelize, { Model } from "sequelize";

// Sequelize를 사용하기 위해 extends Model<>이게 핵심입니다!
export class NoticeVO extends Model<NoticeVO> {

  // 저는 Api를 만들면서 Java의 VO처럼 사용하기 위해서 Interface처럼 만들었습니다.
  // VO가 아닌 ORM만 이용하실 경우 밑은 안만들어도 됩니다.
  idx: number;
  title: string;
  content: string;
  type: string;
  leg_dt: Date;
  mod_de: Date;
}

// ORM을 이용하기 위한 객체 생성입니다.
// DB Table 만드는 것과 비슷한 맥락이라 이해하기 쉬우실 겁니다.
NoticeVO.init(
  {
    idx: {
      type: Sequelize.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    title: {
      type: Sequelize.STRING,
      allowNull: false
    },
    content: {
      type: Sequelize.TEXT,
      allowNull: true
    },
    type: {
      type: Sequelize.ENUM("NOTICE", "ETC"),
      allowNull: false
    },
    leg_dt: {
      type: Sequelize.DATE,
      allowNull: false
    },
    mod_dt: {
      type: Sequelize.DATE,
      allowNull: true
    }
  },
  {
  	// 제가 만든 sequelize Connection 입니다 Java로 치면 DataSource 같은(?)
    sequelize,
    modelName: "NoticeVO",
    tableName: "c_notice" // 제가 사용하는 DB 테이블 명입니다.
  }
);

 

그리고 이제 실제 Sequelize를 이용하여 DB Data를 조회해보겠습니다.

 
  getBoards(page: number = 1): Promise<any> {
    return new Promise((resolve, reject) => {
      NoticeVO.findAll({
        attributes: ["idx","title", "type" ,"leg_dt", "mod_dt"],
        order: [["leg_dt", "DESC"]],
        limit: 10,
        offset: (page - 1) * 10
      }).then(notice => {
        resolve(Utiles.responseToJson(200, notice));
      });
    });
  }

위의 코드를 간단히 설명해 드리겠습니다.

ORM을 사용한 부분은 NoticeVO.findAll()입니다. 그리고 attributes, order 같은 option을 이용하여 제가 원하는 데이터를 가져올 수 있어요. 옵션들은 홈페이지를 참고해주세요.

 

위의 코드를 Sql로 나타내면 다음과 같습니다.

"SELECT idx, title, type, leg_dt, mod_dt FROM c_notice ORDER BY leg_dt DESC LIMIT 10 OFFSET 0"

물론 WHERE 같은 옵션도 줄 수가 있습니다!

 

그럼 실행을 시켜보겠습니다.

실행을 하면 DB c_notice 테이블이 noticeVO로 객체로 변한다고 해야 하나요?

 

그리고 FindAll입니다.

다음과 같이 제 DB에 쌓여있는 Data들이 다 나왔네요. LIMIT 10을 했는데 데이터가 2개밖에 없어서...ㅋㅋㅋ

 

이렇게 사용해 봤는데 node js를 시작한지 2일인가 3일만에 이렇게 할 수 있다는게 확실히 Java 같은 언어보다 쉽다고 느껴집니다.

 

sequelize를 사용하면서 transaction 같은 기능도 사용해봤는데 그건 다음에 작성하겠습니다.

홈페이지에 있는 메뉴얼보다는 조잡하지만 그래도 적용한 경험을 공유해봤습니다.

 

 

참고 : 

ORM

https://jayzzz.tistory.com/66

 

Java ORM

https://victorydntmd.tistory.com/195

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함