
일대일 연관 관계란 예를 들어서 Member와 Locker 의 관계라고 보면 된다.
회원은 하나의 락커를 가질수 있고, 락커의 주인은 오로지 한명이다.
이럴때 사실 한곳에만 저장해도 되지만 정규화하면서 분리하기도 한다.

jpa에서는 어떤식으로 일대일 관계를 맵핑하는지 살펴보자
일대일 관계는 반대로 봐도 일대일이다.
그렇기때문에 주테이블 또는 대상 테이블 중에 한곳에 외래키를 맵핑하면 된다.
외래키에 데이터베이스 유니크 조건 추가해야하는데 추가를 안해도 사용은 가능하다.
추가를 하지 않으면 에플리케이션에서 관리를 잘해야한다.

위의 그림은 회원을 주테이블로 보고 회원에 락커 외래키를 넣은 모습이다.
락커 안에 회원의 외래키를 넣어도 상관은 없다. 한곳에만 들어가 있으면 된다.
외래키가 있는 곳이 연관관계의 주인이다.
여기서는 Member가 연관관계의 주인이다.

연관관계 주인인 Member에 이제 @JoinCulumnrhk @OneToOne을 넣어 준다.

locker에는 @OneToOne(mappedBy="") 만 작성해주면 된다.
이제 실행을 해주면 member 테이블에 locker의 외래키가 생성된다.


물론 반대로 Locker가 주테이블이 되어도 된다.
그렇게 하면 locker 테이블에 member_id로 외래키가 생성된다.
1대1 관계에서 생각해 볼 점
과연 우리는 1대1 관계에서 어디다가 외래키를 넣어야할까?
어디다가 넣어도 구현은 가능하지만 넣는 곳이 어딘지에 따라 꽤 차이가 존재한다.
주 테이블에 외래키(Member에 외래키)
- 주 테이블에서 외래 키를 두고 대상 테이블을 찾음 -> member 테이블에 locker 외래키를 두고 locker를 찾음
- 객체지향 개발자 선호
- JPA 매핑 편리
장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
Join없이 Member만 조회해도 우리는 locker_id를 보고 값이 존재하는지 확인 할수있음(성능상 이점)
반대의 경우는 Locker도 조회해야한다는 불편함이 존재
단점: 값이 없으면 외래 키에 null 허용
대상 테이블에 외래키(Locker에 외래키)
- 대상 테이블에 외래 키가 존재
- 전통적인 데이터베이스 개발자 선호
장점: 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지(전통적인 데이터베이스 개발자 선호하는 이유)
단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨(치명적!)
JPA 에서는 Member를 조회 할때 Locker에 null 또는 프록시 객체를 넣어줘야한다.
하지만 Member만 조회해서는 Locker에 값이 있는지 알수가 없기때문에 항상 Locker도 조회해야한다.
'Spring > JPA' 카테고리의 다른 글
| JPA ) JPQL 문법 1 (0) | 2023.04.23 |
|---|---|
| JPA ) 객체지향 쿼리 언어 소개 (0) | 2023.04.23 |
| JPA ) 연관관계 (0) | 2023.02.20 |
| JPA ) 플러시(Flush) 란? (0) | 2022.12.13 |
| JPA ) 기본키 맵핑 (1) | 2022.11.19 |