반응형
JPA 에서 엔티티의 연관관계를 설계하는 방법은 대표적으로 2가지가 있습니다.
1. @JoinColumn (조인 컬럼 - 외래 키)
2. @JoinTable (조인 테이블 - 테이블 사용)
이 글은 2가지 방법중 하나인 조인 테이블 사용법에 대해 간략하게 정리한 글입니다.
조인 테이블 장점
외래 키에 null을 허용하는 관계를 피할 수 있다.
이게 무슨말인지 코드를 먼저 보여드리면
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "name")
@Comment("이름")
private String name;
@OneToOne
@JoinColumn(name = "locker_id", nullable = true) // null 허용됨
private Locker locker;
}
이렇게 외래 키에 null을 허용하는 관계를 선택적 비식별 관계라 한다.
조인할 때 외부 조인(OUTER JOIN)을 사용해야 하며 아주 가끔 관계를 맺는다면 대부분 null로 저장된다.
이러한 상황에 조인 테이블을 적용하려면 위의 엔티티 코드를 아래처럼 변경해주면 된다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "name")
@Comment("이름")
private String name;
@OneToOne
@JoinTable(name = "member_locker",
joinColumns = @JoinColumn(name = "member_id"),
inverseJoinColumns = @JoinColumn(name = "locker_id"))
private Locker locker;
}
먼저 각각의 옵션에 대해 설명드리면
1. name : 생성할 테이블 이름
2. joinColumns : 현재 엔티티를 참조하는 외래 키
3. inverseJoinColumns : 반대방향 엔티티를 참조하는 외래 키
@JoinColumn을 @JoinTable로 변경해주고 각각의 옵션을 작성하면 JPA가 테이블을 아래와 같이 만들어준다.
연관 관계를 관리하는 조인 테이블(member_locker)을 추가하고 여기서 두 테이블의 외래 키를 관리한다.
조인 테이블 단점
관리해야 하는 테이블이 늘어난다.
member 테이블과 locker 테이블을 조인하려면 member_locker 테이블까지 조인해야 한다.
참고 - 자바 ORM 표준 JPA 프로그래밍 (김영한)
반응형