기록과 정리

JPA 연관관계 다중성 ( N:1, 1:N, 1:1, N:M ) 본문

IT/JPA

JPA 연관관계 다중성 ( N:1, 1:N, 1:1, N:M )

zepetto 2021. 2. 16. 17:31

이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 강의를 참고하였습니다.

www.inflearn.com/course/ORM-JPA-Basic/lecture/21695?tab=curriculum

 

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

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

www.inflearn.com

 

연관관계 다중성

 

종류 

  • 다대일 @ManyToOne
  • 일대다 @OneToMany
  • 일대일 @OneToOne
  • 다대다 @ManyToMany


다대일 @ManyToOne [ N:1 ]

가장 많이 사용하며 일반적이 경우

@ManyToOne 및 @JoinColumn로 연관 관계 매핑

 

양방향일 경우

다대일 양방향 연관관계
@OneToMany 추가 및 mappedBy 설정

 

일대다 @OneToMany [ 1:N ]

단방향일 때 , 일(1)이 연관관계의 주인으로 설정 보통 다(N)에 FK가 존재한다. 

일대다 연관관계

객체와 테이블의 차이때문에 반대편 테이블 에서 FK를 관리하는 구조 , 연관관계 관리를 위해 UPDATE SQL 이 실행된다.

전혀 상괸없는 Member 테이블을 Update

일대다 양방향 매핑은 공식적으로 존재하지 않지만 양방향처럼 사용하는 방법으로

insertable , updatable 을 이용한다.

위와 같이 설정도 가능하지만 되도록이면 다대일 양방향을 사용하자.

 

일대일 @OneToOne [ 1:1 ]

일대일은 거꾸로 해도 일대일 , 하지만 주테이블과 대상테이블을 정해주도록 하자. 왜? 외래키가 두 개 존재하기 떄문에

양방향일때는 ?

 

주 테이블에서의 매핑
반대편 대상 테이블은 mappedBy 사용!

대상 테이블 기준으로 단방향 연관관계는 성립하지 않는다. 하지만 양방향 연관관계는 성립가능

 

  • 주테이블 기준 단방향 연관관계 o 
  • 주테이블 기준 양방향 연관관계 o
  • 대상 테이블 기준 단방향 연관관계 x
  • 대상 테이블 기준 양방향 연관관계 o

주테이블 기준 양방향 연관관계를 뒤집은 것 과 같다.

 

주 테이블 외래키 기준으로 잡느냐 , 대상 테이블 외래키 기준으로 잡느냐는 객체 지향을 유지하느냐 , 테이블 구조에 대한 전통적인 데이터베이스형 개발 방식을 선호하느냐에 따른 선호의 차이인듯하다. 

 

다대다 @ManyToMany [ N:M ]

 

단순 연결 방식

주테이블
대상테이블

특이한건 주테이블에 @JoinTable(name="MEMBER_PRODUCT")인데 MEMBER_PRODUCT라는 중간 테이블을 생성하여 연결해주는 방식을 사용한다.

보기에는 간단해 보이지만.. MEMBER_PRODUCT에 매핑되어진 PK 또는 FK 외에는 인스턴스를 추가할 수 없다는 단점이 있다. 예를 들어 price나 time ( 실무에서 쓰기 부적합하다. 더욱 더 복잡해질 테이블로 인해 )

 

따라서 강의에서는 해결책으로 MEMBER_PRODUCT를 하나의 엔티티로 승격(?) 시키는것을 추천한다.

 

MemberProduct Entity
product entity
member entity

다대다에 대한 한계를 중간 테이블을 엔티티화 시키면서 극복이 가능하다. 하지만 어지간한 이유 아니면 사용하는것을 추천하지 않는다.