[JPA] 연관관계 매핑 | @ManyToMany

장수현·2021년 10월 13일
0

에어비앤비

목록 보기
6/15

연관관계 매핑

연관관계 매핑이란 객체의 참조와 테이블의 외래키를 매핑하는 것을 의미한다.
JPA에서는 JDBC(Mybatis)를 사용했을 때와 달리 연관 관계에 있는 상대 테이블의 PK를 멤버변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조한다.
이전 'Gallery'프로젝트를 만들 땐 category 테이블의 id값만 참조하는 형식으로 만들었었다.

단방향 vs 양방향

  • 단방향 관계 : 두 엔티티가 관계를 맺을 때, 한 쪽의 엔티티만 참조하고 있는 것
  • 양방향 관계 : 두 엔티티가 관계를 맺을 때, 양 쪽이 서로 참조하고 있는 것
    사실 양방향 관계란 서로 다른 단방향 연관관계 2개를 로직으로 양방향인 것처럼 보이게 할 뿐이다.

다중성

  • 다대일(N:1)
  • 일대다(1:N)
  • 일대일(1:1)
  • 다대다(N:M)
    어떤 엔티티를 중심으로 상대 엔티티를 바라 보느냐에 따라 다중성이 다르다.

연관 관계의 주인

간단하게 말해서 외래 키를 등록, 수정, 삭제할 수 있는 엔티티가 주인이다.

숙소↔편의시설의 연관 관계는?

이전 'Gallery' 프로젝트에서는 한 개의 작품(Art)이 한 개의 분류(Category)에만 속했기 때문에 category의 id를 Art가 가지고 있는 방식으로 구현했지만
이번 프로젝트의 숙소는 여러개의 편의시설을 가지고 있을 수도 있고 편의시설 역시 여러개의 숙소의 포함될 수 있으므로 다대다 연관관계로 설정하였다.

다대다(ManyToMany)관계일 경우 두 테이블의 외래키를 복합키로 하여 PK를 갖는 테이블을 따로 생성하게 된다.
JPA에서는 테이블 생성을 따로 할 필요 없이 어노테이션을 달아주면 자동으로 중간 테이블을 생성해준다.

// 숙소 엔티티
@Getter
@NoArgsConstructor
@Entity
public class Home {

	...생략
	
    // 편의시설 관계 매핑
    @ManyToMany
    @JoinTable(name = "home_facilities", joinColumns = @JoinColumn(name = "home_id"), 
    	inverseJoinColumns = @JoinColumn(name = "facilities_id"))
    private List<Facilities> facilities = new ArrayList<>();

	...생략
}
  • @ManyToMany : 다대다 관계
  • @JoinTable : 다대다 관계에서 생성할 테이블 명을 정의하는 어노테이션
    - name 속성 : 새로 생성되는 중간 테이블의 이름 정의
    • joinColumns 속성 : join할 자신의 칼럼 이름 작성
    • inverseJoinColumns 속성 : join할 다른 엔티티의 칼럼 작성

0개의 댓글