22.06.02
일대일 [1:1]
주 테이블이나 대상 테이블 중에 외래키 선택
- 주 테이블: 주로 많이 액세스하는 테이블
- 대상 테이블: 주 테이블에 비해 액세스가 적은 테이블
외래키에 데이터베이스 유니크(UNI) 제약조건 추가

위에서는 MEMBER 테이블에 외래키를 두고 유니크 제약조건을 추가했다.
연관관계 주인은 테이블과 같이 Member로 설정 => 다대일 방식과 유사
단방향
@OneToOne @JoinColumn(name = "LOCKER_ID") Locker locker

양방향
@OneToOne(mappedBy = "locker") Member member 추가

위에서는 LOCKER 테이블에 외래키를 두고 유니크 제약조건을 추가했다.
연관관계 주인은 테이블과 다르게 Member로 설정 => 일대다 방식과 유사
지원 X
양방향으로 설계 (Locker를 연관관계 주인으로) => 주 테이블 외래키(양방향)과 동일
어디에 외래키를 둘까? 정해진 답은 없다.
유니크 제약 조건만 지우면 다대일 관계로 변경 가능하다.
LOCKER 쪽에 외래키를 두면, 회원 1명이 여러 개의 라커(N)를 소유할 수 있는 기능으로 변경시 유리
MEMBER 쪽에 외래키를 두면, 회원 select 시에 라커의 소유 여부를 확인 가능
각자의 tradeoff가 있다.
• 주 테이블에 외래 키
주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음
객체지향 개발자 선호, JPA 매핑 편리
장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
단점: 값이 없으면 외래 키에 null 허용
• 대상 테이블에 외래 키
전통적인 데이터베이스 개발자 선호
장점: 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨(프록시는 뒤에서 설명
다대다 [N:M]
실무에서 사용X
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 한다.
객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능하다.j
JPA가 연결테이블을 추가해서 일대다, 다대일로 매핑해준다.
개발자가 만든 테이블이 아니기 때문에 예상치 못한 쿼리가 나가기도 한다.
@ManyToMany @JoinTable(name = "연결테이블 이름")
연결테이블을 엔티티로 승격시켜 일대다, 다대일 관계로 매핑한다.

PK 두개를 묶어서 사용. 컴포짓 아이디를 생성해야 한다.

GeneratedValue로 PK 따로 생성.
유지보수가 심플하다.
실전 예제 - 3. 다양한 연관관계 매핑
배송, 카테고리 추가


ORDERS-DELIBERY 는 일대일 관계로 주 테이블인 ORDERS에 FK를 두는 것으로 설계
CATEGORY-ITEM 은 다대다 관계로 사이에 연결테이블인 CATEGORY_ITEM을 두어 일대다, 다대일 관계로 변환
(다대다: 예제 한정)

Order-Delivery: 일대일 양방향
Category-Item: 다대다 양방향. 연결테이블(JoinTable)O, 연결엔티티X
Category-Category: 일대다, 다대일 양방향. Category parent, List<Category> child
<다대다 매핑>
@ManyToMany의 제약: 필드 추가를 못한다. 외래키만 존재. 엔티티와 테이블이 불일치
-연관관계 주인 (Category)
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID")) List<Item> items
-거울 (Item)
@ManyToMany(mappedBy = "items") List<Catogory> categories