과정을 즐기자

다양한 연관관계 매핑 본문

Spring Data

다양한 연관관계 매핑

320Hwany 2022. 12. 2. 13:15

다대일

데이터베이스 테이블에서 일, 다 관계에서 외래 키는 항상 다쪽에 있다. 객체에서도 마찬가지로 연관관계의 주인이 다쪽으로 하면 다대일 관계이다.
예를들어 주문(order), 회원(member)가 있다고 하자. 한 회원이 여러 주문을 할 수 있다고 하면 주문과 회원은 다대일 관계이다.
이때 외래 키는 다쪽인 주문이 가지고 있다. 따라서 양방향 매핑에서 연관관계의 주인은 order이다.

@ManyToOne
@JoinColumn(name = "member_id")
private Member member;

위와 같이 단방향 매핑을 완성할 수 있다.

@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();

이렇게 mappedBy를 이용하여 양방향 매핑을 완성할 수 있다. 이때 항상 서로를 참조하도록 연관관계 편의 메소드를 만들어두자.

일대다

데이터베이스 테이블 일대다 관계에서 외래 키는 항상 다쪽 테이블에 있다. 하지만 객체 연관관계에서는 일쪽에서 외래 키를 관리할 수도 있다.
하지만 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있기 때문에 더 복잡해지고 더 많은 쿼리를 생성하게 된다.
따라서 일대다 단방향 매핑을 사용하지말고 다대일 양방향 매핑을 사용하자.

참고로 @ManyToOne의 속성에는 mappedBy가 없다는 것을 알 수 있다. 이 말은 다쪽이 항상 연관관계의 주인이 되도록 만들라는 것을 뜻한다.

일대일

테이블 관계에서는 다쪽이 항상 외래 키를 가진다. 반면에 일대일 관계는 주 테이블이나 대상 테이블 둘 중 어느 곳이나 외래 키를 가질 수 있다.

주 테이블에 외래 키

주 객체가 대상 객체를 참조하는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 참조한다. 외래 키를 객체 참조와 비슷하게 사용할 수 있어
객체 지향 개발자들이 선호한다. 주 테이블이 외래 키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계를 알 수 있다는 장점이 있다.

일대일 관계이므로 데이터베이스에는 외래 키에 유니크 제약 조건을 추가해주자. 이 관계는 다대일 매핑과 비슷하다.

대상 테이블에 외래 키

대상 테이블에 외래 키를 두는 방식으로 전통적인 데이터베이스 개발자들이 선호하는 방식이다.
테이블 관계를 일대일에서 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있다는 장점이 있다.

대상 테이블에 외래 키가 있는 일대일 단방향 매핑은 JPA에서 지원하지 않는다. 사용하려면 양방향 매핑을 이용하자.

다대다

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 객체는 테이블과 다르게 객체 2개로 다대다 관계를 만들 수 있다.
@ManyToMany와 @JoinTable을 사용하여 연결 테이블을 매핑하는 것이다. 이 방식으로 단방향, 양방향 모두 표현할 수 있다.

하지만 다대다 매핑에는 한계가 있다. 만들어 준 연결 테이블이 단순히 양쪽 테이블의 외래 키를 담고 끝나지 않고 추가되는 컬럼이 있을 수 있기 때문이다.
이러한 한계를 극복하기 위해 연결 테이블용 엔티티를 추가해주어 다대다 관계를 일대다, 다대일 관계로 풀어서 설정할 수 있다.

이때 추가해준 연결 테이블용 엔티티의 기본 키의 생성 전략은 데이터베이스에서 자동으로 생성해주는 대리 키 Long 값을 사용하는 것이다.
이것의 장점은 간편하고 거의 영구히 쓸 수 있으며 비즈니스에 의존하지 않는다. 그리고 ORM 매핑 시에 복합 키를 만들지 않아도 되므로
간단히 매핑을 완성할 수 있다.

출처 : 자바 ORM 표준 JPA 프로그래밍 (김영한)

'Spring Data' 카테고리의 다른 글

프록시와 연관관계 관리  (0) 2022.12.06
고급 매핑  (0) 2022.12.04
연관관계 매핑  (0) 2022.11.29
엔티티 매핑  (0) 2022.11.29
영속성 관리  (0) 2022.11.27