본문 바로가기
JPA

[JPA] 다양한 연관관계 매핑 (3) - 일대일 (1:1) 연관관계

by 개발현욱 2023. 7. 30.

김영한-JPA

본 포스팅의 이미지 저작권은 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한) 강의에 있습니다.

일대일(1:1) 관계

  • 일대일 관계는 그 반대도 일대일이다.
  • 주 테이블이나 대상 테이블 중에 어느 곳에서든 외래키를 선택할 수 있다.
  • 외래키에 데이트베이스 유니크(UNI) 제약조건이 추가되어야 한다.

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

  • 멤버는 라커를 하나만 소유할 수 있고, 라커도 한 명의 멤버에게 소유될 수 있다.
  • MEMBER 테이블에 LOCKER_ID로 외래키를 설정할 수 있고, 반대로 LOCKER 테이블에 MEMBER_ID로 외래키를 설정할 수 있다.
  • 다대일(@ManyToOne) 단방향 매핑과 유사하다.

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

  • Locker 객체에 Member 객체 참조를 생성하면 된다.
@Entity 
public class Locker {
    @Id @GeneratedValue 
    @Column(name = "LOCKER_ID")
    private Long id;

    private String name;

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

    // 생성자 및 Getter, Setter
}

Locker라는 엔티티를 생성하고, Member로 향하는 참조를 생성한다. @OneToOne 애노테이션을 통해 일대일(1:1) 연관관계를 맺고, 역시나 연관관계 주인의 반대편이므로, mappedBy를 걸어준다.

@Entity 
public class Member {
    @Id @GeneratedValue 
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;

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

    @ManyToOne 
    @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
    private Team team;

    // 생성자 및 Getter, Setter
}

Member와 Locker의 관계에서, Member 엔티티가 외래키를 관리하기 때문에, @JoinColumn 애노테이션을 통해 연관관계 주인으로 지정한다. 마찬가지로 @OneToOne 애노테이션으로 일대일(1:1) 연관관계를 맺는다.

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

  • 다대일(@ManyToOne) 단방향 매핑과 유사하다.

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

  • 다대일 양방향 매핑처럼 외래키가 있는 곳이 연관관계의 주인이 된다.
  • 반대편은 당연히 mappedBy를 적용한다.

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

  • 다대일(N:1) 관계에서처럼, 반대쪽 테이블에 존재하는 외래키를 관리할 수 있나?

-> 불가능하다!!

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

  • 단방향 관계는 JPA에서 지원하지 않는다.
  • 양방향 관계는 지원한다.

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

  • 양방향 연관관계를 맺고, 대상 테이블을 대상 엔티티와 연관관계 매핑을 한다.
  • 사실, 앞서 설명한 주 테이블에 외래키 양방향과 동일하다.

일대일 정리

주 테이블에 외래키

  • 주 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래키를 두고 대상 테이블을 찾는다.
  • 주로 객체지향 개발자가 선호한다.
  • 장점 : 주 테이블만 조회해도, 대상 테이블에 데이터가 있는지 확인 가능하다.
  • 단점 : 값이 없으면 외래키에 null 값을 허용한다.

대상 테이블에 외래키

  • 대상 테이블에 외래키가 존재한다.
  • 주로 DBA가 선호한다.
  • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조를 유지할 수 있다.
  • 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩된다.
728x90
반응형