본문 바로가기

정보/Database

연관 관계 Mapping (3)

1. 상속 관계 매핑

 

RDBMS에는 상속 관계 없지만, 슈퍼타입, 서브타입 관계 모델링 기법이 객체 상속과 유사

객체는 상속 관계의 형태가 유일하지만,

DB설계는 아래와 같이 3가지 방식이 있다. 어떤 방법을 구현하더라도 JPA는 매핑을 지원해준다.

  • JOIN 전략 : 상속 관계처럼 각각의 테이블로 변환
    • 기본적, 정석적인 전략. 객체와 잘맞고, 정규화 잘 되어있고, 설계 입장에서도 좋음.
    • 장점 : 테이블 정규화, 저장 공간 효율화
      외래 키 참조 무결성 제약 조건 활용 가능 (Item만 보면 album, movie, book 조회 가능)
    • 단점 : 조회 시 JOIN을 많이 사용, 성능 저하
      조회 쿼리가 복잡함, 데이터 저장 시 INSERT 2번 호출
  • 단일 테이블 전략 : 논리 모델을 한 테이블로 합치는 것 (성능 때문에)
    • DTYPE을 놓고 구분하는 것
    • 장점 : JOIN이 필요 없음. 조회 쿼리가 단순해 조회 성능이 빠르다
    • 단점 : 자식 column은 null을 허용해줘야 한다.(무결성입장에서 애매)
      오히려 테이블이 커질 수 있고, 성능이 느려질 수 있다.(임계점을 넘어야 함)
  • 구현 클래스마다 테이블 전략
    • 공통된 것 따로 빼지 말고 각각 다 갖는 것.
    • 쓰면 안되는 전략 (DBA, ORM 전문가 둘 다 추천하지 않는 전략)
    • 장점 : 서브 타입을 명확하게 구분해서 처리 할 때 효과적
      not null 제약조건 사용 가능
    • 단점 : 부모 타입으로 조회 시(여러 자식 테이블을 조회하는 상황), 이 데이터가 있는지 없는지 UNION을 통해서 전부 다 뒤짐 (비효율적) => 자식 테이블 

 

2. 주요 Annotation

  • @Inheritance : 상속 전략을 선택하는 것
    • strategy 속성 : InheritanceType.JOINED, SINGLE_TABLE, TABLE_PER_CLASS
  • @DiscriminatorColumn : DTYPE, Entity명을 넣어주는 것. 넣어주는 게 좋다.
    • JOIN 전략에서는 그렇게 필요없을 수 있지만,
    • 단일 테이블 전략에서는 매우 중요하다
      • 그렇기 때문에 단일 테이블 전략에서는 필수로 생성됨
  • @DiscriminatorValue : 자식 클래스의 DTYPE 이름값을 설정 가능.

 

 

3. 구현 시 주의 사항

  • 단일 테이블 전략에서는 dtype 구분을 위해 @DiscriminatorColumn 붙이는 게 필수다.
  • 구현 클래스마다 테이블 전략 사용시 부모 class는 Abstract로 만들어 두는 게 좋다.
    • 왜냐하면 무조건 type이 정해질 것이기 때문에 부모가 단일로 생성되어서는 안된다.
    • @DiscriminatorColumn 은 불필요
  • 어떤 전략을 선택할까?
    • 단순해보이면 단일 테이블 전략
    • 비즈니스적으로 중요하고 복잡할 경우 JOIN 전략

 

 

4. @MappedSuperclass

 

  • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑정보를 모으는 역할
  • 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
  • 위의 구현클래스마다 테이블 사용 전략때처럼,
    엔티티가 아닌 단일 사용시 불가능하도록 추상 클래스 사용 권장 (단일로는 사용되면 안되니)
  • @MappedSuperclass 또는 @Entity 선택 (Table화가 필요하다면 후자, 그게 아니라면 전)
  • BaseEntity 같은 거 만들어 두면 요긴하게 쓰인다. (나중에 JPA에서 자동으로 지정할 수도 있음.)

 

 

5. 실전에서 상속관계의 사용 고민

 

데이터가 충분히 작으면 상속관계가 잘 되지만, 데이터가 충분히 크면 잘 안되는 경우도 있을 수 있다.

처음에는 객체지향적으로 설계하다가

데이터가 커져서 Trade-off를 생각해야 할 경우가 온다면,

JSON을 말아 넣던지 하는 방식으로 진행하는 것을 생각해보기.

'정보 > Database' 카테고리의 다른 글

JPA와 데이터 타입  (2) 2024.11.17
프록시, JPA 최적화  (0) 2024.11.17
연관 관계 Mapping (2)  (1) 2024.11.15
연관 관계 Mapping (1)  (0) 2024.11.15
Entity Mapping  (3) 2024.11.15