DataBase

[Database] ORM에 대해

범데이 2022. 8. 20. 10:36

 

1. ORM이란?

ORM(Object Relational Mapping)이란, 번역하면 (객체-관계-매핑)의 약자로, 다음과 같은 특징을 가지고 있다.

 

  • 프로그래밍 언어의 객체와 데이터베이스의 데이터 관계를 매핑해주는 도구이다.  
  • MVC패턴에서 모델(Model)을 기술하는 도구이다.
  • 객체와 모델 사이의 관계를 기술하는 도구이다.

 

 

2. ORM의 사용 이유

 

OOP vs Relational Database

객체지향 프로그래밍은 클래스를 이용하고 관계형 데이터베이스는 테이블을 이용하는데 여기서 객체 모델과 관계형 모델 간의 불일치가 존재한다. 따라서 ORM을 이용하여 데이터베이스 접근을 프로그래밍 언어의 관점에서 맞출수 있게 된다.

  • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
  • SQL문을 직접 작성하지 않고 엔티티를 객체로 표현할 수 있다.
  • 객체를 통해 간접적으로 데이터베이스를 다룬다.
  • 이를 통해 느슨하게 연결된, 테스트에 용이한 애플리케이션을 만들 수 있다.

 

 

아래는 실제 Typescript언어에서 작성한 Sequelize(대표적인 ORM라이브러리) 사용 코드 일부를 발췌한 것이다.

 

[테이블(tb_test_table) 정의]

module.exports = function (sequelize, DataTypes) {
  let retModule = sequelize.define(
    "tb_test_table",
    {
      col1: {
        type: DataTypes.INTEGER,
      },
      col2: {
        type: DataTypes.FLOAT,
      },
      is_valid: {
        type: DataTypes.STRING,
      },
    },
    {
      timestamps: false,
      freezeTableName: true,
      tableName: "tb_test_table",
    }
  );
  ...

  return retModule;
};

 

[테이블 쿼리]

    db.tb_test_table
      .findAll({
        raw: true,
        nest: true,
        attributes: ["col1", "col2", "is_valid"],
        where: {
          is_valid: "Y",
        },
        order: [
          ["col1", "ASC"],
          ["col2", "ASC"],
        ],
        limit: 200,
      })
      .then((res: any) => {
      	...
      })
      .catch((reason: any) => {
      	console.error(reason)
      });

위와같이 직관적이고 부수적인 코드가 최소화된 실 사용 코드를 볼수 있다.

 

 

 

3. ORM의 장점

객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 도와준다.

  • ORM을 이용하면 SQL Query가 아닌 메서드로 데이터를 조작할 수 있으므로 프로그래머가 객체 모델로 프로그래밍하는 것에 더 집중할 수 있게 도와준다.
  • 선언문, 할당, 종료 같은 부수적인 코드가 없거나 줄어든다.
  • 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드 가독성을 높여준다.
  • SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 생산성이 증가한다.

 

재사용 및 유지보수 편리성이 증가한다.

  • ORM은 독립적으로 작성되어 있고, 해당 객체를 재활용 할 수 있다.
  • 매핑 정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있다.

 

DBMS에 대한 종속성 저하

  • 객체 간 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDBMS의 데이터 구조와 프로그래밍 언어의 객체 모델 사이의 간격을 좁힌다.
  • 대부분의 ORM 솔루션은 DB에 종속적이지 않다.
  • 프로그래머는 Object에 집중하므로 DBMS를 다루는 큰 작업에도 비교적 적은 리스크와 시간만 소요할 수 있다.

 

 

4. ORM 단점

완벽한 ORM으로만 서비스를 구현하기 어렵다.

  • 사용하기는 편리하지만 설계는 신중하게 해야한다.
  • 프로젝트의 복잡성이 커질 경우 난이도 또한 올라간다.
  • 잘못 구현된 경우 일관성이 무너지는 문제점이 발생할 수 있다.
  • 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는 등 별도의 튜닝이 필요한 경우가 있다.

 

프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.

  • 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야 하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.

 

 

 


#References

https://hanamon.kr/orm%EC%9D%B4%EB%9E%80-nodejs-lib-sequelize-%EC%86%8C%EA%B0%9C/

https://eun-jeong.tistory.com/31

 

반응형