- 다양한 연관관계 매핑의 특징과 방법을 파악한다.
- N : 1,
@ManyToOne
- 1 : N,
@OneToMany
- 1 : 1,
@OneToOne
- N : M,
@ManyToMany
@JoinColumn
의 역할을 파악한다.
N : 1 단방향 구조
- 가장 많이 사용하는 연관관계이다.
N : 1 양방향 구조
- 외래 키가 있는 쪽이 연관관계의 주인이 되며, 엔티티가 서로를 참조한다.
- DB 관점에서, 단방향 구조와 차이가 없다. 따라서 엔티티 관점에서 양방향 설계를 고려한다.
@ManyToOne
N : 1 관계를 매핑할 때 사용하며, 속성은 아래와 같다.
- optional :
false
로 설정할 경우, 항상 연관된 엔티티가 있어야한다.
- default :
true
- fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
- default :
FetchType.EAGER
- cascade : 영속성 전이 기능을 사용한다.
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. 주 테이블에 외래 키가 위치
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
관계형 DB는 테이블 2개로 N : M 관계를 표현할 수 없다.
따라서, 연결 테이블을 추가해 1 : N, N: 1로 풀어내야한다.
또한 연결 테이블이 조회 기능뿐만이 아닌 데이터를 다룰 수 있으므로, 연결 테이블을 하나의 엔티티로 구현하여 사용하는 것이 이상적이다.
@ManyToMany
N : M 관계를 매핑할 때 사용하며, 속성은 아래와 같다.
- mappedBy : 연관관계 주인의 필드를 선택한다.
- fetch : 글로벌 페치 전략(즉시 로딩, 지연 로딩)을 설정한다.
- default :
FetchType.LAZY
- cascade : 영속성 전이 기능을 사용한다.
외래 키를 매핑할 때 사용하며,
@ManyToOne
혹은@OneToOne
과 함께 사용된다. 속성은 아래와 같다.
- name : 매핑할 외래 키 이름
- referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명
- foreignKey(DDL) : 테이블을 생성할 때 외래 키 제약 조건을 설정한다.
- unique, nullable, insertable, updatable