다양한 연관관계 매핑

Timo·2021년 4월 16일
0
post-thumbnail

김영한님의 <자바 ORM 표준 JPA 프로그래밍> 책을 정리한 내용입니다.

엔티티의 연관관계를 매핑할 때는 다음 3가지를 고려해야 한다.

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

연관관계의 주인
JPA는 객체 관계가 양방향 연관관계일 경우 두 객체 연관관계 중 하나를를 정해서 데이터베이스 외래키를 관리하는데 이것을 연관관계의 주인이라 한다.
외래 키를 가진 테이블과 매핑한 엔티티가 외래 키를 관리하는 게 효율적이므로 보통 이곳을 연관관계의 주인으로 선택한다.
주인이 아닌 방향은 외래 키를 변경할 수 없고 읽기만 가능하다.

다대일

데이터베이스 테이블의 일(1), 다(N) 관계에서 외래 키는 항상 다쪽에 있다.
따라서 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다.

양방향 연관관계는 항상 서로를 참조해야 한다.
연관관계 편의 메서드를 작성하여 항상 서로를 참조하게 하는 것이 좋다.

일대다

일대다 관계는 다대일 관계의 반대 방향이다.
일대다 관계는 엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션인 Collection, List, Set, Map 중 하나를 사용해야 한다.

일대일 [1:1]

일대일 관계는 양쪽이 서로 하나의 관계만 가진다.
따라서 일대일 관계는 주 테이블이나 대상 테이블 중에 누가 외래 키를 가질지 선택해야 한다.

주 테이블에 외래 키
주 객체가 대상 객체를 참조하는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 참조한다.
이 방법의 장점은 주 테이블이 외래 키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계가 있는지 알 수 있다.

대상 테이블에 외래 키
이 방법의 장점은 테이블 관계를 일대일에서 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있다.

다대다 [N:N]

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
그래서 보통 다대다 관계를 일대다, 다대일 관계로 풀어내는 연결 테이블을 사용한다.

다대다 연관관계는 @ManyToMany 어노테이션과 자동으로 연결 테이블을 생성해주는 @JoinTable을 사용해서 표현할 수 있다.
@ManyToMany를 사용하면 연결 테이블을 자동으로 처리해주므로 도메인 모델이 단순해지고 여러 가지로 편리하다.
하지만 필요 시 컬럼을 추가할 수 없다는 점에서 실무에서 사용하기에는 한계가 있다.

profile
나는 매일 성장하는 사람

0개의 댓글