Object-Relational Mapping(객체 관계형 매핑, ORM)

d4v1d·2022년 3월 11일
0

개요

Object-Relational Mapping(객체 관계형 매핑, ORM)의 개념을 정리한 포스트입니다. 💧

What is ORM?

ORM은 메타데이터 설명자를 사용하여 객체 코드(object code)를 관계형 데이터베이스에 연결하는 프로그래밍 기술을 말합니다. 여기서 객체 코드란 Java, C#과 같은 객체 지향 프로그래밍(OOP) 언어를 말합니다. ORM을 이용해 관계형 DB와 객체 OOP 언어에 공존할 수 없는 데이터 타입 시스템을 변환해줍니다.

Pros & Cons of ORM

Pros

객체 코드와 관계형 DB의 미스매치(mismatch)를 세 가지 접근 방법으로 해결할 수 있습니다.

  • bottom-up 해결할 수 있는 작은 문제들을 종합하여 큰 문제를 해결
  • top-down 큰 문제를 작은 문제들로 모듈화
  • meet in the middle 두 방식을 적절히 mix

위의 data access technique(데이터 접근 기법) 이외에도, ORM이 가진 장점은 많습니다!

  • DRY(Don't Repeat Yourself) 모델을 한 번만(하나만) 작성하고 참조 관리
  • Object-to-table과 table-to-object 변환을 자동화하여 개발이 단순해지고 개발/유지 비용 절감
  • SQL문법 대비 짧고 간결한 코드(query)
  • 기저 database를 수정하더라도 코드를 다시 작성할 필요가 없음
  • Application tier(계층) caching이 투명하기 때문에 시스템 성능 향상
  • 최적화된 솔루션으로 애플리케이션이 빨라지고 유지/보수가 편해짐

Cons

  • 경우에 따라 복잡한 쿼리 실행 시 퍼포먼스가 낮을 수 있음
  • 같은 테이블 내 반복 쿼리를 실행하는 경우(N+1 problem) 데이터베이스를 매 쿼리마다 호출하게 되어 성능 저하로 이어질 수 있음
<?php

$users = User::all();

foreach($users as $user) {
    echo "User: " . $user->name . "<br>";
    foreach($user->roles as $role) {
        // this will make a call to the database for every user.
        echo "\tRole: " . $role->name . "<br>";
    }
}
/***********************************************************************/
# 아래와 같이 해결할 수 있다!
$users = User::with('roles')->all();

foreach($users as $user) {
    echo "User: " . $user->name . "<br>";
    foreach($user->roles as $role) {
        // this already has the role information for each user so will not call the database again.
        echo "\tRole: " . $role->name . "<br>";
    }
}
  • 데이터베이스 레이어를 추상화하기 때문에 데이터에 대한 사전 지식이 충분치 않다면 개발/디버그에 애를 먹을 수 있음

정리

ORM은 개발 시간을 단축하고 코드를 간결하게 만들어주는 좋은 테크닉입니다. CRUD 기능을 갖추어야 하는 프로젝트에 적합한 기술이고, SQL 지식이 충분하지 않더라도 SQL database와 상호작용하는 프로젝트를 개발할 수 있습니다! SQL보다 데이터를 좀 더 읽기 쉬운 형태로 제공해준다는 장점도 있죠.
다만, 개발자들은 복잡한 쿼리를 효율적으로 처리하기 위해서는 반드시 데이터에 대한 사전 지식과 어느정도의 SQL 지식을 갖추어야 합니다. 🍊

profile
데이터 엔지니어/백엔드 개발자 d4v1d의 개발 일지🐯

0개의 댓글