JAVA-JIKIMI / JPA

jpa 완벽 뽀개기
0 stars 0 forks source link

[핵심 pick] 박효원 5주차 #45

Open lsucret opened 2 years ago

lsucret commented 2 years ago

Entity 상속 전략

JPA는 데이터베이스 모델링을 할 때 객체 지향적으로 설계를 합니다.

예를들어 Movie , Music , Book 이라는 테이블이 있을 때 3개의 테이블에는 공통적으로 고유 번호( no ), 이름( name ) , 가격( price )가 있을 수 있습니다.

공통적인 속성은 Item이라는 테이블로 만들어서 상속 받도록 하면 객체 지향적으로 설계가 이루어진 것입니다.

https://user-images.githubusercontent.com/42948301/152677116-1e9c1139-dae6-4022-ba94-4adb257c6594.png

이렇게 객체지향 설계가 이루어졌을 때 JPA에서는 상속이라는 관계를 해결할 수 있어야 합니다.

JPA는 상속을 해결하기 위해 3가지의 방식을 지원합니다.

  1. joined(@Inheritance(strategy = InheritanceType.JOINED))
  2. single table(@Inheritance(strategy = InheritanceType.SINGLE_TABLE))
  3. table per class(@MappedSuperclass)

1) JOINED

JOINED 방식은 no, name, price 속성을 갖는 Item이라는 테이블을 생성하여 Movie , Music , Book 테이블이 Item의 PK를 외래키로 갖는 방식입니다.

정규화가 된 모델링을 사용하기 때문에 데이터의 중복이 없으므로 가장 많이 사용되는 방법입니다.

장점

JOINED 방식은 정규화된 테이블을 사용하므로 데이터의 중복 문제 해결 및 무결성이 보장됩니다.

단점

하지만 SELECT 쿼리 시 join이 많이 일어나기 때문에 성능상의 문제가 발생할 수 있으며, 데이터를 추가할 때 INSERT 쿼리가 2번 실행됩니다.

2) SINGLE_TABLE

SINGLE_TABLE 방식은 Movie , Music , Book 각 테이블의 속성들을 Item 테이블의 속성으로 합치는 방식입니다. 이름 그대로 하나의 테이블로 처리하겠다는 것입니다.

장점

상속 관계에 있는 Entity 관리 편의성과 높은 성능

다른 Entity들과의 Relation 설정 용이

단점

상속 관계에 있는 모든 Entity가 하나의 Table로 구성되면서 각 Entity들의 모든 Attribute들이 포함되어야 한다. 때문에 Entity들이 많을 경우 Table이 비대해진다.

모든 Entity의 Attribute들이 포함되면서 특정 Entity와 관련 없는 Attribute들은 모두 null 값을 가지게 된다. 때문에 Not Null Constrain 사용에 제약이 존재한다.

3) TABLE_PER_CLASS

TABLE_PER_CLASS 방식은 부모의 속성들을 Movie , Music , Book 테이블의 속성으로 갖는 방식입니다.

이 경우 다른 자식 클래스들을 함께 보려면 union을 사용하는데, union 쿼리는 성능을 하락시킬 수 있으므로 이 전략은 잘 사용하지 않습니다.

또한 이 전략은 상속 없이 각 엔터티를 단순히 매핑하는 것과 다르지 않습니다.

참고

https://victorydntmd.tistory.com/209 https://www.baeldung.com/hibernate-inheritance https://www.javatpoint.com/jpa-single-table-strategy