ORM(Object/ Relational Mapping)에 대해서

원문: http://hibernate.org/orm/what-is-an-orm/

ORM 프레임워크인 Hibernate 공식 사이트에서 ORM에 대해서 설명하는 글의 번역입니다.

영속화(Persistence)
Hibernate ORM은 귀하의 애플리케이션이 영속화 기능을 갖도록 돕는 것과 관련된 것이다. 그렇다면 영속화란 개념은 무엇을 말하는가? 영속화는 단순하게 설명하면 애플리케이션의 데이터가 애플리케이션의 프로세스보다 더 오래 지속하게끔 하려는 것을 말한다. Java 용어로 말하면, 객체의 상태가 JVM의 범위를 넘어서서 지속하여 추후에 동일한 상태를 이용하려는 것이다.

관계형 데이터베이스(Relational Databaes)
자세하기 설명하면 Hibernate ORM은 데이터 영속화와 관련된 것으로 관계형 데이터페이스에 적용된다. 객체지향 애플리케이션의 세상에서는 RDBMS에 대항하여 객체 데이터베이스(Object Database)를 사용하는 것에 대한 논의들이 있다. 여기서 이 논의를 살펴보려는 것이 아니다. RDBMS는 매우 인기있는 영속화 메커니즘이며 앞으로도 그렇게 되리라 예측가능한 미래라고 말하면 충분하다.

객체-관계의 임피던스 부정합(The Object-Relational Impedance Mismatch) 1
객체-관계의 임피던스 부정합(때로 패러다임 부정합으로 불리는) 은  객체 모델과 관계형 모델이 서로 잘 어울리지 않는다는 것을 말하는 그저 공상적인 이야기이다. RDBMS는 데이터를 테이블 형태로(스프레드시트가 RDBMS에게 익숙하지 않은 이들에게 좋은 시각적 표현이다.) 표현하는 반면 자바와 같은 객체지향 언어는 데이터를 객첵의 상호연결된 그래프로 표현한다. 테이블 형태의 관계형 데이터베이스를 사용하여 객체의 그래프를 불러오고 저장하는 것은 우리에게 5가지 부정합 문제를 드러낸다.

Granularity
때때론 당신은 데이터베이스 내에 상응하는 테이블의 수보다도 많은 클래스를 가지고 있는 객체 모델을 갖게 될 수도 있다. (우리는 객체 모델이 관계형 모델보다 좀 더 granular하다는 것을 말하는 것이다.) 주소의 개념을 예로 생각해 볼 수 있다.

Subtypes(Inheritance)
상속은 객체지향언어의 자연적 패러다임이다. 그러나 RDBMS는 유사하게나 어떤 것도 정의하지 못한다.(물론 일부 데이터베이스는 하위타입을 지원하지만 완전히 비표준이다.)

Identity
RDBMS는 주요키를 통해서 동일성의 개념을 정확히 정의한다. 그러나 Java는 객체의 아이덴티티( a == b ) 와 동등성( a.equls(b) )을 모두 정의한다.

Association
연관관계는 객체지향언어에서는 단방향 참조로 표현되는 반면에 RDBMS는 외래키를 사용한다. 만약 당신이 Java에 양방향 관계가 필요하다면 이중으로 관계를 맺어야 한다. 마찬가지로 객체의 도메인 모델을 보면서 관계를 복수로 정의할 수 없다.

Data navigation
Java에서 데이터에 접근하는 방법은 근본적으로 관계형 데이터베이스에서 접근하는 것과 다르다. Java에서는 하나의 관계에서 다른 쪽으로 객체의 네트워크를 통해 이동한다. 이러한 방법은 관계형 데이터베이스에서 데이터를 얻는데 효과적이지 않다. 전형적으로 객체의 네트워크에 들어가기 전에 SQL 쿼리의 수를 최소화하고 JOIN을 통해 몇가지 엔티티를 불러오고 해당하는 엔티티를 선택한다.

 

Notes:

  1. 전지공학분야에서 서로 상이한 성질의 전자회로가 접속되는 것을 임피던스 매칭이라고 부르는 것에 유래하여 기본 철학과 구조가 다른 객체와 관계형 데이터베이스 사이의 부조화를 의미한다고 생각하면 됨