Spring Data JPA - ORM 패러다임 불일치
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
ORM은 어떤 문제를 해결하고 싶은 것인가?
ORM, JPA / 하이버네이트를 학습하기 어려운 이유가 이 프레임워크가 해결하려는 문제가 어렵기 때문이다.
객체를 릴레이션에 맵핑하려니 발생하는 문제들과 해결책에 대해서 알아보자.
밀도(Granularity) 문제
객체 | 릴레이션 |
---|---|
다양한 크기의 객체를 만들 수 있고 커스텀한 타입을 만들기 쉬움 | 테이블, 기본 데이터타입(UDT는 비추) |
서브타입(Subtype) 문제
객체 | 릴레이션 |
---|---|
상속 구조 만들기 쉬움, 다형성 | 테이블엔 상속이라는 개념이 없음. 상속 기능을 구현했다 하더라도 표준 기술이 아님. 다형적인 관계를 표현하기 가어려움. |
이 서브타입 문제를 예를 들어보자.
만약 자바에서 선언된 USER 클래스를 릴레이션에 매핑한다고 해보자.
그리고 USER가 다른 두 테이블에 있는 키를 외래키로 가지게하려고 한다고 가정해보자.
그러나 릴레이션에서는 이것이 불가능하다.
릴레이션에서는 테이블과 테이블간의 외래키는 한 다른 테이블에 있는 주키를 외래키로 설정할 수 있기 때문이다.
식별성(Identify) 문제
객체 | 릴레이션 |
---|---|
레퍼런스 동일성 (==) 인스턴스 동일성(equals() 메소드) | 주키 (primary key) |
관계(Association) 문제
객체 | 릴레이션 |
---|---|
객체 레퍼런스 관계 표현, 근본적으로 ‘방향’이 존재. 다대다 관계를 가질 수 있음. | 외래키로 관계 표현, ‘방향’이라는 개념이 없음, 그냥 Join으로 아무거나 묶을 수 있음. 태생적으로 다대다 관계를 만들 수 없으며 조인 테이블 또는 링크 테이블을 사용해 두개의 1대다 관계로 풀어야함. |
데이터 네비게이션(Navigation) 문제
가장 어렵고, 복잡하며 성능에도 영향을 주는 문제이다.
객체 | 릴레이션 |
---|---|
레퍼런스를 이용해서 다른 객체로 이동 가능. 콜렉션을 순회할 수 있음 | 하지만 그런 방식은 릴레이션에서 데이터를 조회하는데 있어서 매우 비효율적. 데이터베이스에 요청을 적게 할 수록 성능이 좋다. 따라서 Join을 쓴다. 하지만 너무 많이 한번에 가져오려고 해도 문제다. 그렇다고 lazy loading을 하자니 그것도 문제다. (n+1 select) |
Reference
인프런 백기선님의 스프링 Data JPA