본문 바로가기
Spring/JPA

연관 관계 매핑

by YoonJong 2022. 9. 22.
728x90

연관관계에서 고려해야할 점은 아래와 같다

 

1. 다중성 - 일대다 / 다대일 / 다대다 / 일대일

2. 방향 - 단방향 / 양방향

3. 연관 관계의 주인


다중성

- 일대다 ( 1: N ) @OnetoMany

- 다대일 ( N:1 )  @ManytoOne

- 다대다 ( N:M ) @ManytoMany

- 일대일 ( 1:1 ) @ OnetoOne

 


방향

 - 단방향 : 한쪽으로 가는 방향

 - 양방향 : 양쪽으로 가는 방향

 

DB 테이블에서는 외래키(FK) 하나로 조인을 사용해서 양방향으로 쿼리가 가능하다.

 ** DB 에서는 방향이라는 개념이 없다

 

객체는 방향의 개념이 존재한다.

참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다.

 

 

 ?? 무조건 양방향 관계를 하면 안될까 ??

- 일반적인 비즈니스에서 엔티티들은 서로 많은 연관관계를 갖게 된다.

양방향 관계를 설정하면 불필요한 매핑으로 인해 복잡성이 증가하게 된다.

따라서, 기본적으로는 단방향 매핑으로 설정하고, 역방향으로 꼭 필요하다고 생각될 때 추가하는 것이 좋다.

 


연관관계의 주인

 

데이터베이스에서는 외래키(FK) 를 사용해서 두 테이블의 연관관계를 맺는다.

따라서, 연관관계를 관리하는 것은 외래키 하나이다.

 

JPA 에서는 두 객체 중 하나를 정해서 외래키를 관리하게 하는데, 

외래키를 관리하는 객체를 연관관계의 주인 이라고 한다.

 

대다수는 외래키를 가진 테이블과 매핑되는 엔티티가 외래키를 관리하는 것이 효율적이다.

보통 이곳을 연관관계의 주인으로 선택한다.

 

수정 및 변경은 연관관계의 주인인 외래키를 가진 곳에서만 가능하며, 주인이 아닌곳은 조회(읽기)만 가능하다.

 


다대일 ( N : 1 ) 연관관계 

team 에는 여러명은 Member 를 가질 수 있으며, Member(1명) 는 하나의 팀에 속하게 된다.

 - 단방향

@ManyToOne
@JoinColumn(name = "team_id")
private Team team;

 

양쪽을 서로 참조하게 할 수 있다. 

mappedBy 를 사용하며, 조회만 가능하다.

- 양방향

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

name 값 & mappedBy 값


일대다 ( 1 : N ) 연관관계  : 다대일 양방향 매핑을 사용하자

 - 일대다 ( 1: N ) 에서 일(1) 이 연관관계의 주인

 - 테이블 일대다 관계는 항상 다(N) 에 외래키가 존재

  ** 외래키와 연관관계의 주인은 보통 같지만, 특이한 구조를 가진다.

 - @JoinColumn 을 꼭 사용해야 하며, 사용하지 않으면 중간 테이블이 생기게 된다.

 - 연관관계 관리를 위해 추가로 Update 쿼리가 실행 -> 복잡해짐.

 

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;

일대일 ( 1 : 1 ) 연관관계

Member 를 연관관계 주인으로 설정

 - 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인이 된다.

@OneToOne
@JoinColumn(name = "locker_id")
private Locker locker;

Locker 에서는 mappedBy 를 이용해 양방향으로 매핑한다.

@OneToOne(mappedBy = "locker")
private Member member;

 

일대일 관계 중 대상 테이블의 외래 키가 있는 단방향 관계는 지원하지 않는다.


다대다 ( N : M ) 연관관계 : 쓰지 않는다.

 다대다를 쓰지 않고 중간에 entity를 만들어 연결 엔티티로 승격시켜 해결한다

 

 

- 참고

https://ttl-blog.tistory.com/129

 

[JPA] 연관관계 매핑하는 방법

연관관계를 매핑할 때는 다음의 3가지를 고려해서 매핑하여야 합니다. 다중성 (일대 다, 다대 일, 다대 다, 일대 일) 방향 (양방향, 단방향) 연관관계의 주인 다중성 연관관계에는 다음과 같은 다

ttl-blog.tistory.com

https://jeong-pro.tistory.com/231

 

JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다)

JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면, "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 생각합니다. 🏅 왜냐하면 JPA의 목적인 "객체 지향 프

jeong-pro.tistory.com

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

728x90

'Spring > JPA' 카테고리의 다른 글

JPA 프록시  (1) 2022.09.26
상속관계 매핑 ( @Inheritance , @DiscriminatorColumn )  (0) 2022.09.23
연관 관계가 필요한 이유  (0) 2022.09.21
필드와 컬럼 매핑  (0) 2022.09.20
데이터베이스 스키마 자동 생성  (0) 2022.09.20

댓글