일대일 관계
일대일 관계는 대칭적이다.
따라서 주 테이블이나 대상 테이블 중에 외래키를 넣을 곳을 선택할 수 있다.
예를 들어, 주테이블인 Member에 외래키를 넣을 수 있고, 대상 테이블인 Team에 외래키를 넣을 수 있다.
외래키에 데이터베이스 유니크 제약 조건을 추가해야 한다.
유니크의 유무가 일대일과 다대일을 구분 짓는 차이점이 된다.
일대일 - 주 테이블에 외래키 단방향
Member를 주 테이블로 설정했기 때문에 Member에 외래키를 놓았다.
Locker 테이블을 주 테이블로 정할 수도 있다.
그때는 Locker 테이블에 MEMBER_ID(FK, UNI)를 추가해야 한다

다대일 단방향 매핑과 유사하며, 어노테이션 차이만 있다.
아래는 주 테이블에 일대일 단방향을 설정하는 코드이다.
//Member.java
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
일대일 - 주 테이블에 외래키 양방향
다대일 양방향 매핑과 유사하다.
외래 키가 있는 곳이 연관관계의 주인이며, 연관관계 주인의 반대편은 mappedBy를 사용한다.

아래는 주 테이블에 일대일 양방향을 설정하는 코드이다.
Locker가 Member를 참조하는 코드가 추가되었다.
//Member.java
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
//Locker.java
@OneToOne(mappedby = "locker")
private Member member;
일대일 - 대상 테이블에 외래키 단방향
JPA에서 지원하지 않으므로 불가능하다.

일대일 - 대상 테이블에 외래키 양방향
Member를 주테이블로 잡았을 때 Locker에 외래키가 존재한다.
이 때는 Locker.member를 연관관계의 주인으로 설정 후 매핑하면 된다.
사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법이 동일하다.

정리
주 테이블에 외래키
- 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래키를 둔다.
- JPA 매핑이 편리하여 객체 지향 개발자가 선호하는 방식이다.
- 장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인할 수 있다.
- 단점: 값이 없으면 외래키에 null을 허용한다.
대상 테이블에 외래 키
- 대상 테이블에 외래키를 둔다.
- 전통적인 데이터베이스 개발자가 선호한다.
- 장점: 주 테이블과 대상 테이블을 일대일에서 일대다로 변경할 때 테이블 구조를 유지할 수 있다.
(ex: 하나의 회원이 여러 개의 라커를 가질 수 있도록 변경됨-> 유니크 제약조건만 빼면 된다.)
- 단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩이 된다.
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com