ORM (Object-Relational Mapping) 이란?

yc999·2020년 11월 8일
0

java

목록 보기
1/6

ORM 이란?

Object-Relational Mapping의 줄임말로, 호환되지 않는 다른 DB의 데이터를
OOP(Object-Oriented Programming) language의 데이터로 변환하는 것이다.

RDBMS를 예시로 들면, RDBMS는 테이블을 사용하고, OOP에서는 클래스를 사용하기 때문에
서로 관계나 데이터 타입이 일치하지 않는다. 일치하지 않는 데이터를 서로 맵핑하여 DB의 데이터를 마치 object 같이 제어할 수 있다.

다음 예시를 보자. RDBMS의 persons tables에서 id=10 인 사람의 정보를 가져오는 로직을 SQL을 사용하여 구현한다면 다음과 같다.

var sql = "SELECT id, first_name, last_name, phone, birth_date, sex, age FROM persons WHERE id = 10";
var result = context.Persons.FromSqlRaw(sql).ToList();
var name = result[0]["first_name"];

하지만 같은 로직을 ORM 기술을 이용하여 구현한다면 다음과 같이 표현할 수 있다.

var person = Person.Get(Person.Properties.Id == 10);

Person class를 구현하여 DB의 persons 테이블과 맵핑시켜 주어야 하는 작업이 필요하지만, 의미있는 수준으로 실제 비즈니스 로직에만 집중할 수 있게 만들어준다.

물론 ORM이 모든 문제를 해결해주는 해결사는 아니다, 장단점들에 대해 알아보자.

장점

코드를 더 객체지향적으로 작성할 수 있다.

위의 예시에서 사용되었던 SQL문을 보면

var sql = "SELECT id, first_name, last_name, phone,
           birth_date, sex, age FROM persons WHERE id = 10";

단순히 하드코딩 된 문자열이다. ORM 기술을 사용하면, 이 이러한 SQL문을 직접 사용하는 것이 아니라, 클래스의 메소드 형태로 호출하기 때문에 코드의 가독성을 높일 수 있고 코드를 더 객체지향적으로 생각할 수 있다.

DBMS 종속성을 덜어낼 수 있다

사용하는 DBMS를 Mysql에서 PostgreSQL로 바꾸고 싶을 때, 맵핑에 대한 정의만 업데이트하면 되기 때문에 더 DBMS의 종속성을 낮출 수 있다. 하지만 DB-specific 한 기능을 사용하고 있었을 경우에는 완벽하게 기존의 비즈니스 코드를 재활용하지 못 할 수 있다.

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

  1. SQL 문을 직접 사용하지 않기 때문에 테이블 구조가 변경된다고 하더라도, 맵핑 정의만 업데이트 해 준다면 기존 비즈니스 로직을 재활용 할 수 있다.
  2. 한 번 매핑 관계를 정의해 객체 (ex. Person class) 를 만들어 두면, 해당 객체들을 재활용 할 수 있다.

단점

러닝 커브가 있다

ORM 구현 프레임워크를 처음 접하는 개발자에게 부담을 줄 수 있다.

SQL을 전혀 사용하지 않아도 되는 것은 아니다

최적화, DB 고유 기능 사용을 위해 결국 SQL문을 사용하게 되는 경우가 많다.

개인적으로는 content 필드의 substring을 가져와야 하는 경우가 있었다. 이것을 content 필드를 모두 가져와서 서버에서 substring을 구하는 것 보다. 애초에 substring을 가져오는 SQL을 정의하여 사용하는 것이 성능상의 이득이 큰 경우가 있었다.

DB 고유 기능을 사용하지 않으면 DBMS 종속성을 덜어낼 수 있지만, DBMS의 강력한 기능을 사용하지 못하는 것은 개발자 편의를 위해 퍼포먼스를 포기하는 배보다 배꼽이 더 큰 상황을 낳을 수 있다.

Refs

Wikipedia : Object-relational Mapping
[DB] 🤔 ORM이란? - 빠리의 택시 운전사

profile
꼬물꼬물 앞으로 가는 중

0개의 댓글