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



© 2022. by minkuk

Powered by minkuk