[JPA 4] 연관관계, 상속관계 매핑

HyeonJeong·2023년 1월 5일
0

spring JPA 공부하자

목록 보기
5/6

이번에는 매핑에서 각 엔티티 간 연관 관계 설정과 상속인 경우 매핑하는 방법에 대해 정리해보았습니다!

📌 연관 관계 매핑

  • 용어

    • 방향(Direction): 단방향, 양방향
    • 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해
    • 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요
  • 객체와 테이블이 관계를 맺는 차이

    • 테이블의 연관 관계 1개(양방향) = 객체 당 연관 관계 2개(단 방향 2)
  • 양방향 매핑 규칙

    • 연관관계의 주인만이 외래 키를 관리
    • 주인X : mappedBy 속성 사용
  • 연관 관계 매핑 시, 고려사항 3가지

    • 단방향, 양방향
    • 연관관계의 주인
    • 다중성
      1. 다대일: @ManyToOne

      2. 일대다: @OneToMany → 1이 연관관계 주인

        ↔ 테이블 일대다 관계는 다 쪽에 외래 키

        @JoinColumn 사용으로 중간에 테이블 추가 방지

      3. 일대일: @OneToOne → 외래 키가 있는 곳이 연관관계의 주인

        • 주 테이블에 외래 키 : 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음 → 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
        • 대상 테이블에 외래 키 → 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지, 그러나 지연 로딩 불가
      4. 다대다: @ManyToMany & @JoinTable(연결 테이블 지정)

        • 정규화된 테이블 2개로 다대다 관계를 표현 불가능 함 → 연결 테이블을 추가해서 일대다, 다대일 관계로 표현함
        • 객체는 컬렉션을 사용으로 다대다 관계 가능

        실전에서는 중간 테이블이 복잡해서 사용x


📌 상속 관계 매핑

1. 조인 전략 : 각각 테이블로 변환

  • 장점 : 테이블 정규화, 외래 키 참조 무결성 제약조건 활용, 저장 공간 효율화 가능
  • 단점 : 조인을 많이 사용하면 성능 저하, 조회 쿼리 복잡, 데이터 저장시 쿼리 2번

2. 단일 테이블 전략 : 통합 테이블로 변환

  • 장점 : 조회 성능이 빠르고, 조회 쿼리가 단순함
  • 단점 : 자식 엔티티가 매핑한 컬럼은 모두 null 허용하고, 단일 테이블에 모든 것을 저장해서 테이블이 커질 수 있음

3. 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환

  • 장점 : 서브 타입을 명확하게 구분해서 처리할 때 효과적이며, not null 제약조건 사용 가능
  • 단점 : 여러 자식 테이블을 함께 조회할 때는 UNION 쿼리로 성능이 느리고, 자식 테이블 통합해서 쿼리하기 어려움 ⇒ 데이터베이스 설계자와 ORM 전문가 둘 다 추천X

위 내용을 구현하기 위해 @Inheritance(strategy=InheritanceType.XXX) 이용

  • XXX : JOINED, SINGLE_TABLE, TABLE_PER_CLASS

  • @MappedSuperclass

    • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
    • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 → 추상 클래스 권장
    • @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능

0개의 댓글