JPA/JPA

[JPA] 다양한 연관관계 매핑 - 일대일

yoon_seon 2023. 4. 14. 19:55

일대일[1:1]

  • 일대일 ↔ 일대일 대칭성을 갖는다.
  • 일대일 관계이기 때문에 주 테이블이나 대상 테이블 중에 외래키를 선택하여 넣을 수 있다.
  • 외래키에 데이터베이스 유니크(UNI) 제약조건이 추가되야 사용할 수 있다.

일대일 : 주 테이블에 외래 키 단방향

요구사항

  • 하나의 회원은 하나의 사물함을 가지고 있다.
  • 하나의 사물함은 하나의 회원만 사용할 수 있다.

@Entity
@Getter @Setter
public class Member {
	@Id @GeneratedValue
	private Long id;
	
	@Column(name = "USERNAME")
	private String username;
	
	@ManyToOne
	@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
	private Team team;
	
	@OneToOne
	@JoinColumn(name="LOCKER_ID")
	private Locker locker;
}

@Entity
@Getter @Setter
public class Locker {
	@Id @GeneratedValue
	private Long id;
	private String name;
}

주 테이블인 Member에 @OneToOne을 추가하여 Locker를 참조하도록 설정하고 @JoinColumn을 사용하여 외래키만 매핑해 주었다.

 

일대일 매핑은 다대일 단방향 매핑과 유사하다.

 

일대일 : 주 테이블에 외래 키 양방향

@Entity
@Getter @Setter
public class Member {
	@Id @GeneratedValue
	private Long id;
	
	@Column(name = "USERNAME")
	private String username;
	
	@ManyToOne
	@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
	private Team team;
	
	@OneToOne
	@JoinColumn(name="LOCKER_ID")
	private Locker locker;
}

@Entity
public class Locker {
	@Id @GeneratedValue
	private Long id;
	private String name;
	
	@OneToOne(mappedBy = "locker")
	private Member member;
}

 

Locker에 @OneToOne을 추가하여 Member를 참조하도록 설정하고 mappedBy로 연관관계의 주인을 매핑해주면 양방향 관계가 성립하게 된다.

 

일대일 : 대상 테이블에 외래키 단방향

그림과 같이 대상 테이블에 외래키 단방향 관계는 JPA에서 지원하지 않는다.

대신 양방향 관계는 지원한다.

 

일대일 : 대상 테이블에 외래키 양방향

사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같다.

 

 

일대일 관계에서 주 테이블 외래키 VS 대상 테이블 외래키

데이터베이스 입장에서 외래키를 Member 테이블이 가지고 있는게 좋을까? Locker 테이블이 가지고 있는게 좋을까?

테이블은 한 번 만들어지면 변경되기 어렵다.

시간이 흘러서 미래에 하나의 Member가 여러개의 Locker를 가질 수 있다고 비즈니스 로직이 변경된다면 Locker에서 유니크 제약조건을 풀면 되기 때문에 다 쪽인 Locker 테이블에 외래키를 두는것이 변경에 유리하다.

하지만 다 쪽이 확률이 높은 테이블에 외래 키를 놓는 게 무조건 좋은가?

그건 또 아니다.

객체 입장에서는 Member에서 외래키를 가지게 된다면 Member를 조회할 때 마다 Locker를 참조하기 때문에 성능상 이점이 있다.

전체적으로 판단하고 결정해야하는데 아주 신중하게 정했다고 가정한다면 주테이블인 Member에 외래키를 두는 것이 더 나을 수 있다.

 

주 테이블에 외래키

  • 주 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래키를 두고 대상 테이블을 찾음
  • 객체지향 개발자가 선호
  • JPA 매핑이 편리
  • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
  • 단점 : 값이 없으면 외래키에 null 허용(DBA입장에서는 치명적이다.)

대상 테이블에 외래키

  • 대상 테이블에 외래키가 존재
  • 전통적인 데이터베이스 개발자 선호
  • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대 다 관계로 변경할 때 테이블 구조 유지
  • 단점 : 프록시 기능의 한계로 지연로딩으로 설정해도 항상 즉시로딩됨

 

 

 


해당 글은 인프런의 [자바 ORM 표준 JPA 프로그래밍 - 기본편] 강의를 정리한 내용입니다.

 

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

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

www.inflearn.com