JPA 다양한 연관관계 매핑

김두현·2023년 4월 26일
1

JPA

목록 보기
8/14
post-thumbnail

Goal

  • 다양한 연관관계 매핑의 특징과 방법을 파악한다.
    • N : 1, @ManyToOne
    • 1 : N, @OneToMany
    • 1 : 1, @OneToOne
    • N : M, @ManyToMany
  • @JoinColumn 의 역할을 파악한다.

N : 1 관계

N : 1 단방향 구조

  • 가장 많이 사용하는 연관관계이다.

N : 1 양방향 구조

  • 외래 키가 있는 쪽이 연관관계의 주인이 되며, 엔티티가 서로를 참조한다.
  • DB 관점에서, 단방향 구조와 차이가 없다. 따라서 엔티티 관점에서 양방향 설계를 고려한다.

@ManyToOne

N : 1 관계를 매핑할 때 사용하며, 속성은 아래와 같다.

  • optional : false로 설정할 경우, 항상 연관된 엔티티가 있어야한다.
    • default : true
  • fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
    • default : FetchType.EAGER
  • cascade : 영속성 전이 기능을 사용한다.

1 : N 관계

1 : N 단뱡향 구조

  • 1 쪽이 연관관계의 주인이다.
  • 외래 키는 N 쪽에 위치하므로, 반대편 테이블의 외래 키를 관리한다.
  • default로 @JoinTable을 사용하기 때문에, @JoinColumn을 반드시 사용해야한다.
  • 권장되지 않는 모델이다. 이유는 아래와 같다.
    • 외래 키가 다른 테이블에 위치하므로, 추가적인 UPDATE query를 실행해야한다.
    • 대안으로 N : 1 양방향 매핑을 사용하는 것이 이상적이다.

1 : N 양방향 구조

  • 공식적으로 존재하지 않는다.
    @JoinColumn(insertable=false, updatable=false) 을 통해 편법처럼 사용한다.
  • 대안으로 N : 1 양방향 매핑을 사용하는 것이 이상적이다.

@OneToMany

1 : N 관계를 매핑할 때 사용하며, 속성은 아래와 같다.

  • mappedBy : 연관관계 주인의 필드를 선택한다.
  • fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
    • default : FetchType.LAZY
  • cascade : 영속성 전이 기능을 사용한다.

1 : 1 관계

1 : 1 관계에서는 외래 키가 위치할 테이블을 선택하게 된다.
1. 주 테이블에 외래 키가 위치
2. 대상 테이블에 외래 키가 위치
또한 값이 중복되지 않도록 외래 키에 unique 제약조건을 추가해야한다.


주 테이블에 외래 키 - 1 : 1 단방향 구조

  • LOCKER 테이블에 MEMBER_ID를 넣고 Locker 엔티티와 매핑하는 것과 동일하다.
  • @ManyToOne 단방향 매핑과 유사하다.

주 테이블에 외래 키 - 1 : 1 양방향 구조

  • 외래 키가 위치한 곳이 연관관계의 주인이 되므로, 반대편은 mappedBy 속성을 적용해야한다.

대상 테이블에 외래 키 - 1 : 1 단방향 구조

  • JPA에서 지원하지 않는다.

대상 테이블에 외래 키 - 1 : 1 양방향 구조

  • 주 테이블에 외래 키 - 1 : 1 양방향 구조 의 매핑 방법과 동일하다.

주 테이블에 외래 키 vs 대상 테이블에 외래 키

  • 주 테이블에 외래 키
    • 객체지향 개발자가 선호하며, JPA 매핑이 편리하다.
    • 장점 : 주 테이블만 조회해도 대상 테이블의 데이터를 확인할 수 있다.
    • 단점 : 값이 없다면 외래 키에 null을 허용한다.

  • 대상 테이블에 외래 키
    • DataBase 개발자가 선호한다.
    • 장점 : 주 테이블과 대상 테이블의 관계가 1 : N 으로 변경되어도 테이블 구조가 유지된다.
    • 단점 : Proxy 기능의 한계로 즉시 로딩이 강제된다.

@OneToOne

1 : 1 관계를 매핑할 때 사용하며, 속성은 아래와 같다.

  • mappedBy : 연관관계 주인의 필드를 선택한다.
  • fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
    • default : FetchType.EAGER
  • cascade : 영속성 전이 기능을 사용한다.
  • optional : false로 설정할 경우, 항상 연관된 엔티티가 있어야한다.
    • default : true

N : M 관계

관계형 DB는 테이블 2개로 N : M 관계를 표현할 수 없다.
따라서, 연결 테이블을 추가해 1 : N, N: 1로 풀어내야한다.
또한 연결 테이블이 조회 기능뿐만이 아닌 데이터를 다룰 수 있으므로, 연결 테이블을 하나의 엔티티로 구현하여 사용하는 것이 이상적이다.


@ManyToMany

N : M 관계를 매핑할 때 사용하며, 속성은 아래와 같다.

  • mappedBy : 연관관계 주인의 필드를 선택한다.
  • fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
    • default : FetchType.LAZY
  • cascade : 영속성 전이 기능을 사용한다.

@JoinColumn

외래 키를 매핑할 때 사용하며, @ManyToOne 혹은 @OneToOne과 함께 사용된다. 속성은 아래와 같다.

  • name : 매핑할 외래 키 이름
  • referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명
  • foreignKey(DDL) : 테이블을 생성할 때 외래 키 제약 조건을 설정한다.
  • unique, nullable, insertable, updatable

참고 자료

https://www.inflearn.com/course/ORM-JPA-Basic


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글