JPA

객체지향 모델과 관계형 모델의 패러다임의 불일치

voider 2021. 4. 26. 16:10

'The Object-Relational Impedance Mismatch'는 객체 모델을 관계형 모델에 저장할 때 발생하는 문제, 즉 패러다임의 불일치에서 오는 문제를 말한다. 이 문제를 해결하는 게 ORM의 과제다.

Persistence

Persistence란 애플리케이션의 데이터가 애플리케이션 프로세스 범위를 넘어서 지속되는 것을 말한다. Java용어로 치자면 객체의 상태거 JVM범위를 넘어서 유지되는 것이라고 생각하면 된다.

객체 모델 & 관계형 모델

RDBMS는 데이터를 테이블 형식으로 표현한다. 반면 자바 같은 객체지향 모델은 객체 그래프로 데이터를 표현한다. 따라서 객체를 테이블 형식으로 저장하면 다섯 가지 불일치 문제가 발생한다.

1.세분성(Granularity)
데이터베이스의 테이블 수보다 더 많은 클래스가 있는 객체 모델이 있을 수 있다. 객체 모델이 관계형 모델보다 더 세분화되어 있기 때문이다. 테이블의 수보다 객체의 수가 많은 예제를 직접 보면 이해하기 쉽다.

create table Contact (
    id integer not null,
    first varchar(255),
    last varchar(255),
    middle varchar(255),
    notes varchar(255),
    starred boolean not null,
    website varchar(255),
    primary key (id)
)

이런 속성을 가진 테이블이 있다고 하자. 객체에서는 Contact라는 클래스 안에 저 속성을 전부 다 넣을 수도 있겠지만 보통 그렇게 하지 않는다.

public class Contact {
    private Integer id;
    private Name name;
    private String notes;
    private URL website;
    private boolean starred;
    //Getters and setters are omitted for brevity
}

public class Name {
    private String first;
    private String middle;
    private String last;
    // getters and setters omitted
}

테이블은 하나지만 클래스는 두 개인 불일치 문제가 발생한다.

2.Subtypes(상속)
RDBMS에는 상속이란 개념이 없다. 하위 타입을 지원하긴 하지만 표준화되어 있지 않다.

3.동일성(Identity)
RDBMS는 정확히 하나의 동일성을 보장하는 개념인 기본 키(Primary Key,PK)를 제공한다. 하지만 (Java)객체는 동일성(==) 뿐만 아니라 동등성(equals())을 모두 정의한다.

4.연관성(Associations)
객체지향 언어에서 연관관계는 단방향 참조로만 이루어진다.
RDBMS는 외래 키(Foreign key, FK) 하나를 사용해서 양방향 참조를 가진다. 하지만 객체 모델은 단방향 참조가 기본이고 양방향을 참조하려면 양쪽에 연관을 두 번 정의해야 한다.

5.데이터 탐색(Data navigation)
Java에서 데이터에 접근할 때 하나의 객체에서 출발해 다른 연결로 이어지는 객체 그래프 탐색 방식을 사용한다. 하지만 이 방식은 관계형 데이터베이스에서 이 방식은 비효율적이다. RDBMS는 SQL쿼리를 최소화하기 위해 JOIN을 통해 여러 엔티티를 불러와서 데이터를 탐색한다.

reference:
What is Object/Relational Mapping?
Hibernate User Guide