다대다 관계 특징
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없습니다.
여기서 정규화란 중복성을 없애고, 일치하지 않는 종속성을 제거하는 작업입니다.
이 작업을 통하면 데이터베이스의 유연성을 높이고, 효율적인 데이터베이스 스키마 설계의 기초를 다질 수 있습니다.
데이터베이스 정규화 설명 - Office
데이터베이스를 정규화하는 방법과, 형식을 정규화하는 대신 사용할 수 있는 여러 가지 방법을 설명합니다. 데이터베이스 원칙을 이해하려면 데이터베이스 원칙을 마스터하거나 문서에 나와
learn.microsoft.com
잘 정규화된 두 제품과 공장 테이블이 있다고 가정하겠습니다.
둘의 관계는 아래 그림과 같이 다대다 관계를 가집니다.
이 다이어그램은 제품(Product)과 제품이 생산되는 공장(Plant) 사이의 관계를 나타낸 것입니다.
한 개 제품은 여러 공장을 거쳐 생산될 수 있으며, 공장은 여러 제품의 생산 과정에 영향을 끼칩니다.
다대다를 테이블에 표현하기
위 그림을 관계형 데이터베이스에 구현하기 위해서는 두 테이블 사이에 연결 테이블을 추가해야 합니다.
이런 경우 Product, Plant 객체 중 하나에 @JoinTable 어노테이션을 사용하면 명시적으로 테이블을 만들지 않아도 됩니다.
이 그림을 보면 뭔가 느낌이 오시나요?
사실 이렇게 연결 테이블을 구성하면 PRODUCT - PLANT 조합이 단 한 개 밖에 오지 못 합니다.
만약 공정 과정이 복잡해져서 제품A가 A PLANT → B PLANT → A PLANT 로 돌아오는 경우가 있다면 어떻게 될까요?
PRODUCT_PLANT 테이블 아래 ORDER 컬럼이 하나가 추가되더라도 중복된 조합을 표현하지 못 합니다.
복합키 전략에서 벗어나기
복합키를 사용하면 ORM 매핑에서 처리할 일이 상당히 많아집니다.
복합키를 위한 식별자 클래스를 만들고 @IdClass 또는 @EmbeddedId 어노테이션을 사용해야 합니다.
여기에 식별자 클래스에는 equals, hashCode 까지 구현해야 합니다.
중복된 조합을 허용하고, 복잡한 복합키 전략에서 벗어나기 위해 새로운 기본 키를 사용합니다.
다대다 관계를 만드는 새로운 기본 키(PRODUCT_PLANT_ID)는 비즈니스 로직과 관계 없고, 중복을 허용하기 때문에 관리가 용이합니다.
이렇게 사용하기 위해서는 Product, Plant 객체에서 Route(ProductPlant 객체) 방향으로 @OneToMany 어노테이션을 추가합니다.
다대다 연관관계 정리
다대다 관계를 일대다 + 다대일로 풀어내기 위해 연결 테이블을 만들 때에는 식별자 구성법을 잘 선택해야 합니다.
만약 테이블의 모든 이력이 두 대상의 조합만으로 이루어진다면, 받아온 식별자를 기본 키와 외래 키로 사용한 식별 관계로 만들어 줍니다.
반대로 테이블의 모든 이력이 두 대상의 여러 중복된 조합들로 이뤄진다면 받아온 식별자들은 외래 키로만 사용합니다.
그리고 실제 기본 키는 비즈니스 로직과 관계 없는 새로운 기본 키를 만들어 사용합니다.
'Backend > JPA' 카테고리의 다른 글
[JPA] JPQL을 Test 하는 간단한 방법 (0) | 2023.07.23 |
---|---|
[JPA] 프록시 객체의 직관적 이해 (0) | 2023.06.12 |
[JPA] 영속성 컨텍스트 1차 캐시의 주의점 (0) | 2023.06.06 |
[JPA] org.hibernate.PersistentObjectException: detached entity passed to persist 에러 (0) | 2023.06.06 |
[JPA] StackOverflowError (0) | 2023.05.27 |