[ 국비학원수료! 근데 JPA를 안 배웠네? ] 상속관계 매핑, @MappedSuperclass

JYS·2024년 1월 8일
0
post-thumbnail

🤔 상속관계 매핑?

관계형 데이터베이스는 상속관계라는 개념이 없다.
하지만 슈퍼타입과 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하기 때문에 이점을 이용하여 상속관계 매핑을 하고있다.
(객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑)
DB에서 슈퍼타입과 서브타입의 논리모델을 디자인 했을때 실제 물리 모델로 구현하는 전략은 3가지가 있다.

1. 조인 전략 ( JOINED )

가장 정규화된 방법으로 각테이블을 join하는 방식으로 데이터 를 저장하게되며 데이터가 정규화 되어 저장되기 때문에 중복되는 데이터(name, price)를 줄일 수 있고, 객체의 관계와 가장 유사하다.
@Inheritance(strategy = InheritanceType.JOINED)과 객체의 상속(extends)을 사용하여 매핑한다.
위 모델링 처럼 슈퍼타입, 서브타입관계로 정규화되어 저장되어지고, select하게되면 join을 통해 데이터를 가지고온다.

DTYPE이 생략 되었는데 일반적으로 넣어주는 것이 좋다 @DiscriminatorColumn( name ="D_TYPE" )을 사용하여 column명과 함께 설정할 수 있다.
설정해주면 기본값으로 Entity명이 타입으로 들어가게 되는데 DB만 봤을때 어떤 Entity를 통해서 insert된건지 알기 위해서 넣어주는것이 좋다.
(@DiscrimatorValue("xxx") 를 통해서는 등록되는 Entity명을 변경할 수 있다.)


2. 단일 테이블 전략

프로젝트가 단순하고, 한 테이블로 설계가 고려될 때 사용할 수 있다.

select쿼리가 join하지않고 나가고, insert쿼리는 테이블이 하나이기 때문에 한번만 요청하게 된다 이러한 점으로 성능상 이점을 얻기 위해 고려할 수 있다.

단일 테이블 전략은 DiscrimatorColumn이 없어도 DTYPE컬럼이 디폴트로 생성되어진다.
조인 전략에서는 DTYPE이 없더라도 테이블을 조인해서 알아낼 수 있지만 단일 테이블 전략은 어떤 타입인지 알 수 없기때문에 필수로 들어가게 된다.


3. 구현 클래스마다 테이블을 만드는 전략

슈퍼타입의 컬럼을 각 서브타입 테이블에 넣어 서브타입으로만 각 테이블을 만드는 전략이다
( 구현클래스만 테이블을 만든다 )

단순하게 값을 넣고, 뺄때는 좋아보이지만 부모 타입으로 조회할때
union all을 통해 모든 테이블(album,movie,book)을 전부 조회하게된다 그렇기때문에 굉장히 비효율적으로 동작하게된다.


장점과 단점

✔ 조인전략

  • 장점
    테이블이 정규화되어 있고 제약조건을 슈퍼타입(부모객체)에 걸어 맞출 수 있다.
    정규화 되어져 있기 때문에 저장공간을 효율적으로 사용할 수 있다.
  • 단점
    조회시 조인을 많이 사용, 성능 저하
    조회 쿼리가 복잡하고 데이터 저장시 insert sql 2번 호출된다.

( 저장 공간이 효율화 되어저 있기 때문에 어떠한 측면에서는 성능이 더 좋을 수 있고, 조인전략이 객체와 잘 맞기때문에 조인전략을 기본으로 사용하는것이 좋다. )

✔ 단일 테이블 전략

  • 장점
    조인이 필요 없으므로 일반적으로 조회 성능이 빠르고, 조회 쿼리가 단순하다.
  • 단점
    자식 엔티티가 매핑한 컬럼은 모두 null 허용해야한다.
    단일테이블에 모든 것을 저장하므로 테이블이 커질 수 있고, 상황에 따라 조회 성능이 오히려 느려질 수 있다.

✔ 구현 클래스마다 테이블 전략

이 전략은 쓰지 않는걸 추천한다.
서브 타입을 명확하게 구분해서 처리할 때 효과적이고 각각 not null제약조건을 사용할 수 있지만,
여러 자식 테이블을 함께 조회활 때 성능이 느리고(union sql), 자식 테이블을 통합하는 쿼리가 어렵다.

📌 @MappedSuperclass

상속 관계 매핑이 아니며 엔티티, 테이블과 매핑되지 않고 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 하고 조회, 검색이 불가능하다.
( 직접 생성하여 사용할 일이 없으므로 추상 클래스로 만드는걸 권장한다. )

테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.


📚 참고 및 자료 출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한)

profile
go

0개의 댓글