woowacourse-study / 2022-jpa-study

🔥 우아한테크코스 4기 JPA 스터디 (22.06.13~22.07.02) 🔥
5 stars 1 forks source link

[섹션 6, 섹션 7] 오찌 제출합니다 #14

Closed Ohzzi closed 2 years ago

Ohzzi commented 2 years ago

섹션 6. 다양한 연관관계 매핑

연관관계 매핑 시 고려할 것

다중성

단방향과 양방향

연관관계의 주인


이후 설명하는 다대일, 일대다 연관관계에서 회원(Member)은 다(N), 팀(Team)은 일(1)로 서로 관계를 맺는다. 회원에서 팀 쪽으로 연관관계를 맺을 경우 Member.team으로 객체 참조를 하고, 팀에서 회원쪽으로 연관관계를 맺을 경우 Team.members로 컬렉션(List, Set 등)을 통한 참조를 한다.

다대일

다대일 단방향 [N:1]

다대일 양방향 [N:1, 1:N]

일대다

일대다 단방향 [1:N]

일대다 양방향 [1:N, N:1]


일대일 [1:1]

일대일 관계의 특징

주 테이블에 외래 키

대상 테이블에 외래 키

다대다 [N:N]

관계형 데이터베이스는 정규화된 테이블 2개로 다대다를 표현할 수 없음 → 연결 테이블 사용

다대다 단방향

회원(MEMBER)→상품(PRODUCT)으로만 연관관계가 있는 회원-상품 다대다 관계

다대다 양방향

다대다 매핑의 한계와 연결 엔티티

편해 보이지만 실무에서 사용하기에 한계가 있음

따라서 연결 테이블을 아예 엔티티로 만드는 방법이 있음(MemberProduct)

@Entity
@IdClass(MemberProductId.class)
public class MemberProduct {
    @Id
    @ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    @Id
    @ManyToOne
    @JoinColumn(name = "PRODUCT_ID")
    private Product product;

    ...
}
public class MemberProductId implements Serializable {
    private String member;
    private String product;

    // equals and hashcode...
}

섹션 7. 고급 매핑

상속 관계 매핑

관계형 데이터베이스에는 상속이라는 개념이 없지만 슈퍼타입 - 서브타입 관계라는 유사한 모델링 기법이 존재

슈퍼타입 - 서브타입 관계는 논리 모델로, 물리 모델인 테이블로 구현 시 전략을 선택

조인 전략

엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용

장점

단점

단일 테이블 전략

테이블을 하나만 사용하며, 구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분

장점

단점

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

자식 엔티티마다 테이블을 만들고 각각에 필요한 컬럼이 모두 있는 전략

장점

단점

@MappedSuperclass

부모 클래스는 테이블과 매핑하지 않고 자식 클래스에 상속 정보만 제공하고 싶을 때 사용

참고: 엔티티는 엔티티이거나 @MappedSuperclass로 지정한 클래스만 상속 가능

복합 키와 식별 관계 매핑

주의) 여기서 설명하는 부모 - 자식 테이블은 상속 관계가 아님. 기본 키를 내려받았음을 설명하기 위해 부모 - 자식으로 설명

식별 관계 vs 비식별 관계

복합 키 - 비식별 관계

둘 이상의 @Id를 사용하려면 별도의 식별자 클래스를 만들어야 함

@IdClass를 사용해서 식별자 클래스와 매핑 가능

@EmbeddedId도 사용 가능(조금 더 객체지향에 가까운 방법)

참고

복합 키 - 식별 관계

부모, 자식, 손자까지 계속 기본 키를 전달하는 식별 관계에서 자식 테이블은 부모 테이블의 기본 키를 포함해 복합키를 구성해야 함

일대일 식별 관계

일대일 식별 관계는 자식 테이블의 기본 키 값으로 부모 테이블의 기본 키 값 사용

식별, 비식별 관계의 장단점

일반적으로 식별 관계 보다는 비식별 관계를 선호

식별 관계가 비교적 가지는 장점도 있음

따라서 기본으로는 비식별 관계 + Long 타입의 대리 키를 사용하고 필요한 경우 식별 관계를 사용하는 것이 유리

선택적 비식별 관계는 NULL을 허용해서 OUTER JOIN을 사용해야 하므로 필수적 비식별 관계가 유리

조인 테이블

조인 테이블이라는 별도의 테이블을 사용해서 연관관계를 관리하는 방식

엔티티 하나에 여러 테이블 매핑

@SecondaryTable을 사용해 한 엔티티에 여러 테이블을 매핑 가능