백엔드/JPA

[JPA] @JoinTable 조인 테이블 매핑

dami97 2024. 1. 24. 20:12
반응형

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 프로그래밍 (김영한)