연관관계 매핑 3

6009 단어 SpringJPAJPA

공부해 볼 내용

  • 객체의 상속 관계를 어떻게 테이블에 매핑할 지! - 관계형 데이터베이스에는 상속관계가 존재하지 않아서
    • 조인 전략
    • 단일 테이블 전략
    • 구현 클래스마다 테이블 전략

가정 상황

**Item 테이블을 상속받아야 하는 Movie테이블과 Clothes테이블이 있다고 가정 합니다.

주요 코드 및 Annotation

  • @Inheritance(strategy=InheritanceType.XXX)
    • XXX 부분에
      • JOINED : 조인 전략
      • SINGLE_TABLE : 단일 테이블 전략
      • TABLE_PER_CLASS : 구현 클래스 마다 테이블
  • @DiscriminatorColumn(name=“DTYPE”)
    Item 테이블에 DTYPE이라는 칼럼 생성
    • 생성 이유
      DTYPE이라는 칼럼을 생성하는 이유는 Item테이블을 조회했을 때 어떤 테이블이 상속하였는지 확인하기 위해서 생성해놓는 것!
  • @DiscriminatorValue(“XXX”)
    Item 테이블의 DTYPE에 들어갈 value
    즉 Book 테이블이면 "B", Clothes 테이블이면 "C"이런 식으로 지정해 놓고 확인 하는 용도
  • 소스 코드
    Item Entity
@Inheritence(strategy(InheritaceType.JOINED)
//@Inheritence(strategy(InheritaceType.SINGLE_TBLE)
//@Inheritence(strategy(InheritaceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name=“DTYPE”)
public class Item{

	@Id @GeneratedValue
    @Column(name="item_id")
	private Long id;
    
    private int price;

}

Movie Entity

@DiscriminatorValue("M")
public class Movie extends Item{

	private String movieName;
    private String actor;

}

Clothes Entity

@DiscriminatorValue("C")
public class Clothes extends Item{

	private String sorts;

}

조인 전략

상속받는 객체들을 각각 테이블로 만드는 전략. 상속 받는 객체들이 외래 키를 관리하게 되며 외래 키를 활용하여 서로 Join하며 참조 가능.

위 그림과 같은 테이블 형식!

  • 장점
    • 저장공간 효율화
    • 외래 키 참조 무결성 제약조건 활용가능
      즉, 자식 테이블의 값이 변경되면 부모 테이블도 제약이 따름
  • 단점
    • 조회시 조인을 많이 사용 -> 성능 저하!
    • 데이터를 저장할 때 먼저 Item 테이블에 저장 후 상속받은 테이블에 저장 하여야 하므로 Insert SQL 을 2번 호출
  • 정리 : 어느 정도 단점도 있지만 DB 설계상 봤을 때 가장 정규화된 전략!

단일 테이블 전략

상속 받는 객체들의 테이블을 따로 따로 만들지 말고 한 테이블에 모든 데이터를 몰아 넣는 전략.

위 그림과 같이 모든 데이터를 한 테이블이 갖게 됨.

  • 장점
    • 조인이 필요 없으므로 조회가 단순하며 성능이 더 좋음!
  • 단점
    • 자식 엔티티가매핑한 컬럼은 모두 null허용 : 테이블에 null이 많은 것은 좋지 않다.
    • 단일 테이블에 모든 데이터를 몰아 넣으므로 테이블의 크기가 엄청나게 커질 수 도 있음. 이는 오히려 복잡해 질 수 있고 조회 성능도 join전략 때 보다 안좋아 질 수도 있음
  • 정리 : Join전략과 장점과 단점이 바뀜. 가장 단순한 전략이지만 테이블이 너무 커질 수 도 있다는 단점을 가짐.

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

구현된 클래스 마다 전부 테이블을 만들어 관리

이 전략은 추천 X!!!
물론 한 클래스마다 하나의 테이블을 갖고 있으니 명확하게 처리 및 not null 제약 조건과 같은 것을 사용할 수 있습니다.
But, 외래 키가 없기 때문에 여러 자식 테이블을 함계 조회하기 어려움. 즉, 하나로 통합해서 사용하기 어렵다는 뜻.
이는 치명적인 단점!!

이상으로 포스팅을 마치겠습니다. 감사합니다 :)

이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic

좋은 웹페이지 즐겨찾기