@OneToOne 과 @ManyToMany
@OneToOne ( 1 : 1 관계 )
- 일대일 관계는 그 반대도 일대일이다.
- 주 테이블이나 대상 테이블 중 외래 키를 어디에 둘 것인지 선택이 가능하다.
- 외래 키에 DB 유니크( UNI ) 제약조건이 추가되어야 1:1 매핑이 가능하다.
일대일 : 주 테이블에 외래 키 단방향

- 다대일( @ManyToOne ) 단방향 매핑과 유사하다.
- 양방향의 경우도 다대일( @ManyToOne ) 과 유사한 로직으로 구현한다.
일대일 : 대상 테이블에 외래 키 단방향

- 허용되지 않는다. 지원도 되지않고 방법도 없다.
- 양방향 관계는 지원된다.
일대일 : 대상 테이블에 외래 키 양방향

- 사실 매핑되는 과정은 일대일 주 테이블에 외래 키 양방향과 같다.
그렇다면 일대일 관계에서 주 테이블에 외래키 양방향 vs 대상 테이블에 외래키 양방향 무엇이 더 좋을까?
- 둘 중 어떤 방법을 써도 일대일 관계가 유효하게 성립이 된다.
- 테이블이 한 번 생성되면 구조를 변경하기 어렵다는 관점에서 보자. 예를 들어, 시간이 흘러 하나의 회원이 여러 개의 락커를 가질 수 있다고 비지니스 룰이 바뀌게 된다면,
대상 테이블에 외래키 양방향인 경우 alter 명령어를 이용하여 Unique 제약조건만 삭제해주면 된다. - 하지만 반대로, 하나의 락커가 여러 명의 회원을 가질 수 있다고 비지니스 룰이 바뀌게 된다면,
주 테이블에 외래키 양방향인 경우가 @ManyToOne 관계로 변환하기가 로직 면에서 수월하다. - 하지만 위의 케이스는 오로지 DB 관점에서만 본 것이고, 서버 개발자의 입장에서는
주 테이블에 외래키 양방향인 경우가 유리하다. 대부분의 비지니스에서 멤버 테이블을 주로 많이 조회하여 값을 받아오게 되는데 멤버 테이블을 조회할 때에 멤버의 락커도 함께 가져오기 때문이다. - 나는 주 테이블에 외래 키를 두는 방식으로 픽스해야겠다 ^^!
@OneToOne 정리
주 테이블에 외래키
- 주 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾는다.
- 객체지향 개발자가 선호하는 방법이다.
- JPA 매핑하는데에 편리하다.
- 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
- 단점 : 값이 없으면 외래 키에 null 을 허용해야한다.
대상 테이블에 외래키
- 전통적인 데이터베이스 개발자가 선호하는 방법이다.
- 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 관계를 유지할 수 있다.
- 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩된다.
@ManyToMany( N : M 관계 ) - 실무에서 사용하면 안되고, 사용하지 않는다.
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
- 연결 ( 조인 ) 테이블을 추가해서 일대다, 다대일 관계로 풀어내야한다.
REFERENCES
'Spring Data' 카테고리의 다른 글
| JPA Open Session In View (0) | 2021.11.03 |
|---|---|
| JPA 변경감지와 병합 (0) | 2021.11.03 |
| JPA Proxy (0) | 2021.11.03 |
| 연관관계 주인과 mappedBy (0) | 2021.11.03 |
| JPA 영속성 컨텍스트 (0) | 2021.11.03 |