JPA - 식별 & 비식별 관계

Growing_HJ·2024년 7월 31일

JPA

목록 보기
10/15

식별 & 비식별 관계

데이터베이스 테이블 사이의 관계는 외래 키가 기본 키에 포함되는지의 여부에 따라 식별 관계와 비식별 관계로 구분한다.

📍 1. 식별 관계 📍

  • 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계

    -> PARENT 테이블의 기본 키 PARENT_ID 를 받아서,
    CHILD 테이블의 기본 키 (PK) + 외래 키 (FK) 로 사용 한다.


📍 2. 비식별 관계 📍

  • 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계

2-A. 필수적 비식별 관계

  • 외래 키에 NULL 을 허용하지 않는다. 연관관계를 필수로 맺어야 한다.

2-B. 선택적 비식별 관계

  • 외래 키에 NULL 을 허용한다. 연관관계를 선택적으로 맺을 수 있다.

📍 3. 복합 키 - 비식별 관계 매핑 📍

  • JPA 에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다.
    JPA 가 복합키를 지원하는 2가지 방법
  • JPA 는 영속성 컨텍스트에 엔터티를 보관할 때 엔터티의 식별자를 키로 사용한다. 그리고 식별자를 구분하기 위해 equals 와 hashCode 를 사용해서 동등성을 비교한다.
  1. @IdClass : 관계형 데이터베이스에 가까운 방법
  @IdClass 사용시 만족해야 할 조건
    1. 식별자 클래스의 속성명과 엔터티에서 사용하는 식별자의 속성명은 같아야 한다.
    2. Serializable 인터페이스를 구현해야 한다
    3. equals, hashCode 를 구현해야 한다.
    4. 기본 생성자가 있어야 한다.
    5. 식별자 클래스는 public 이어야 한다.
  1. @2EmbeddedId : 객체 지향에 가까운 방법
    @2EmbeddedId 를 적용한 식별자 클래스는 식별자 클래스에 기본 키를 직접 매핑한다.

📍 4. 식별관계 , 비식별 관계의 장단점 📍

식별 관계

  • 부모 테이블의 기본 키를 자식 테이블로 전파하면서 자식 테이블의 기본 키 컬럼이 점점 늘어난다.
    -> 조인할때 SQL 이 복잡해지고 기본 키 인덱스가 불필요하게 커질 수 있다.
  • 식별 관계는 2개 이상의 컬럼을 합해서 복합 기본 키를 만들어야 하는 경우가 많다.
  • 식별 관계를 사용할 때 기본 키로 비즈니스 의미가 있는 자연 키 컬럼을 조합하는 경우가 많다.
  • 식별 관계의 자연 키 컬럼들이 자식에 손자까지 전파되면 변경하기 힘들다.
  • 식별 관계는 부모 테이블의 기본 키를 자식 테이블의 기본 키로 사용하므로 비식별 관계보다 테이블 구조가 유연하지 못하다.

비식별 관계

  • 비식별 관계의 기본 키는 비즈니스와 전혀 관계없는 대리 키를 주로 사용한다.
  • 비식별 관계의 기본 키는 주로 대리 키를 사용하는데 JPA 는 @GenerateValue 처럼 대리 키를 생성하기 위한 편리한 방법을 제공한다.

0개의 댓글