본문 바로가기
Spring/JPA

연관관계 - @OneToOne

by YellowCow 2023. 3. 22.

JPA에서는 DB 테이블 간 관계를 매핑하기 위한 어노테이션들을 지원한다

 

이 페이지에서는 1:1 관계를 매핑하는 @OneToOne 어노테이션에 대해 알아보겠다

 

1:1 관계의 경우, 외래키 관리를 주 테이블에서 할 수도 있고 대상 테이블에서 할 수도 있다

 

예를 들어, 한 사용자 당 1개의 휴대전화만 가질 수 있다고 해보자

 

그럴 경우, 사용자와 휴대전화 관계는 다음과 같이 DB와 Entity에서 1:1 관계로  표현될 수 있다

 

(1:1 관계의 경우 외래키에 Unique 제약조건이 걸려있어야 한다)

 

주 테이블에서 외래키를 관리할 경우

DB

 

JPA

 

대상 테이블에서 외래키를 관리할 경우

DB

JPA

 

연관관계의 주인

1:1 관계에서는 어느 쪽을 연관관계를 정하든 크게 문제가 없다

 

다만, DBA와 벡엔드 개발자의 관점에 따라 엔티티를 설계하는 방향이 다를 수 있다

 

DBA의 관점

테이블 구조 변경 시

예를 들어, 통신사 정책이 바뀌어서 한 사람당 휴대전화 여러 대를 가질 수 있다고 해보자

 

- 대상 테이블에서 외래키(연관관계의 주인)을 둘 경우

위 경우에는 외래키인 USER_ID에 Unique 제약조건을 풀어주는것 만으로

한 사용자가 여러대의 휴대전화를 가지게 할 수 있다

 

- 주 테이블에서 외래키(연관관계의 주인)을 둘 경우

위 경우에서 한 사람당 휴대전화를 여러대 가지려면

USER에 있는 외래키를 없에고 CELLPHONE에 외래키를 생성해야한다

이 경우, 테이블에 있는 데이터가 유실되기 떄문에 전자의 경우보다 많은 비용이 든다

 

그러므로, DBA 관점에서는 대상 테이블에 외래키(연관관계의 주인)를 두는 게 유리하다

 

벡엔드 개발자의 관점

벡엔드 개발자 입장에서는 주로 관심을 가지는 엔티티(테이블)는 User이다

Cellphone을 통해서 User를 조회하는 경우보다

User를 통해서 Cellphone을 조회하는 경우가 많다

 

아래에서는 벡엔드 개발자 입장에서

실제 DB의 외래키 위치에 따른 비교를 해보겠다

 

데이터 조회 시

- 주 테이블에 외래키를 둘 경우

주 테이블만 조회해도 대상 테이블에 값이 있는지 알 수 있다

만약 대상 테이블에 값이 없으면 NULL을 허용해야 한다

 

 

- 대상 테이블에 외래키를 둘 경우

양방향 관계 사용필요

대상 테이블의 외래 키 단방향 매핑을 JPA에서 지원하지 않는다

User에서 Cellphone에 대한 참조값을 가지고 있지 않다

그래서 어떤 유저가 가진 휴대전화를 조회하려면

User쪽에서 Cellphone에 대한 참조값을 두어

양방향 관계를 이용해야 한다

어떤 유저가 가진 휴대전화를 바로 조회할 수 있다

 

지연로딩 사용불가

비지니스상 주로 User를 조회하게 된다

이 상황에서 Cellphone에 데이터가 존재하는지 알려면

User를 조회함과 동시에 Cellphone을 조회할 수 밖에 없다

지연로딩을 사용할 수 없다는 얘기이다

 

그래서 지연로딩으로 Cellphone을 가져오도록 설정해도

즉시로딩으로 Cellphone 데이터를 가져오게 된다

 

 

양방향 연관관계 적용 

주 테이블에서 외래키를 관리할 경우

1. 1:1 관계에서 대상 테이블(엔티티) Cellphone에 user 참조변수 추가

 

2. OneToOne 관계 설정 및 mappedBy 속성 추가

 

대상 테이블에서 외래키를 관리할 경우

1. 1:1 관계에서 주 테이블(엔티티) User에 cellphone 참조변수 추가

2. OneToOne 관계 설정 및 mappedBy 속성 추가

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

상속관계 매핑  (0) 2023.03.24
연관관계 - @ManyToMany  (0) 2023.03.23
연관관계 - @OneToMany  (0) 2023.03.18
연관관계 - @ManyToOne  (0) 2023.03.17
양방향 연관관계 주의점  (0) 2023.03.15

댓글