연관관계 매핑2-고급 매핑

ttomy·2022년 2월 16일
0

상속관계 매핑

관계형 DB에는 상속이란 개념이 없다. 대신 슈퍼타입-서브타입 관계 라는 모델링 기법이 가장 유사하다. 이 슈퍼타입 서브타입 모델을 실제 물리모델로 구현하는 방법은 3가지가 있다.

각각의 테이블로 변환(조인전략)

  • 자식 테이블이 부모 테이블의 키를 받아 pk,fk로 이용하는 방법이다.
    조회할 때는 join을 이용하기에 join이 자주 사용된다.

  • 테이블은 객체와 달리 타입의 개념이 없다. 때문에 DTYPE을 이용한다.
    부모인 ITEM의 DTYPE 컬럼에 자식테이블의 종류에 따라 다른 값을 저장해 자식테이블의 타입을 구분할 수 있다.

    장점으로는 테이블이 정규화되고, 외래 키 참조 무결성 제약조건을 활용할 수 있다는 것, 저장공간에 효율적으로 데이터를 저장한다.
    단점은 조회,insert의 성능에서 불리하다. join이 많이 사용되기에 성능저하가 될 수 있고 쿼리가 점점 복잡해진다. 데이터를 insert할때도 자식과 부모 테이블에 모두 insert하므로 두번이 실행된다.

@Inheritance(strategy=Inheritance.JOINED)
@DiscriminatorColumn(name="DTYPE")

통합 테이블로 변환(단일 테이블 전략)


자식 테이블의 필드까지 포함하여 한 테이블로 만든다. 그리고 DTYPE을 통해 어떤 자식타입이 저장되었는지 구분한다.

  • 자식 엔티티에 매핑된 칼럼은 모두 null이 허용되어야 한다. 어떤 자식 데이터가 저장될 떄 다른 자식데이터에서 필요한 컬럼은 사용되지 않기 떄문이다.

  • 장점은 join을 하지 않기에 조회성능이 빠르다는 것,조회쿼리가 단순하다는 것이다. 단점은 테이블의 크기가 커질 수 있고 이 떄문에 때에따라 조회성능이 안좋아질 수 있다. 자식 엔티티에 매핑된 칼럼은 모두null을 허용하게 신경써야 한다는 점도 단점이다.

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE") ---필수

서브타입 테이블로 변환(구현 클래스마다 테이블 전략)


자식 테이블이 부모객체의 필드들을 포함하도록 구성하는 방법이다.
자식 엔티티마다 테이블을 만들게 되어 일반적으로 추천되지는 않는 방법이다.

  • 장점은 서브타입을 구분해서 처리해야 할 떄 효과적이다. 구분칼럼을 사용할 필요가 없다.
    단점은 여러 자식 테이블을 함께 조회한다면 성능이 느리다.
    자식 테이블을 통합해서 쿼리하기가 어렵다.

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

MappedSuperclass

실제 데이터베이스에 매핑되지는 않고 자식 테이블에 매핑될 때에 부모로서의 정보만 넘기고자 할 떄 사용되는 것이 mappedsuperclass이다.
자바의 추상 클래스와 비슷한 개념으로 부모테이블로써 공통된 데이터들을 자식에게 넘길 목적으로만 정의되는 클래스이다.

  • 부모로부터 물려받은 매핑정보를 재정의하려면
    @AttributeOverride(s), 연관관계를 재정의하려면 @AssociationOverride(s)
    를 사용한다.

복합 키와 식별관계 매핑

식별관계vs비식별관계

외래 키가 기본 키에 포함되는지의 여부에 따라 나뉜다.

  • 식별관계
    부모 테이블의 기본키를 내려받아 자식 테이블에서 기본키이자 외래키로 사용하는 관계이다.
  • 비식별관계
    부모 테이블의 기본 키가 자식 테이블에서 외래 키로만 사용되는 관계이다.

최근에는 기본적으로 비식별관계를 이용하고 필요할 때에만 식별관계를 이용하는 추세라고 한다. 식별관계를 이용하면 기본키가 점점 복잡하고 커지게 되고, 비즈니스 로직에 영향을 받은 조합으로 기본키가 설정되는 경향이 강하기에 비즈니스 로직의 변경에 종속적이 될 수 있다.

물론 식별관계도 장점이 있다. 기본 키 인덱스를 활용하기 좋고, 자식 테이블이 상위테이블의 키까지 가지고 있기에 조인없이 조회를 해 성능이 개선되는 상황도 있다. 떄문에 상황에 따른 선택이 필요하다.

프록시와 연관관계

프록시

sql은 객체 그래프 탐색과 다르게 조회범위를 sql문으로 정하고 탐색한다.
이런 차이로 db와 연결된 객체 탐색을 할 때 조회범위를 유동적으로 하기 위해 지연로딩을 이용한다. 이 지연로딩을 할 때 데이터베이스 조회를 지연하기 위한 가짜객체가 필요한데 이를 프록시 객체라 한다.

0개의 댓글