✍연관관계 매핑시 고려사항
- 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음
- 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데인 구조. 사실, 단방향 2개라고 볼 수 있다.
ㆍ다중성
ㆍ단방향, 양방향
ㆍ연관관계의 주인
❓❗ 다대일 [N:1] @ManyToONe
❓❗ 일대다 [1:N] (운영 측면에서 권장하지 않음) @OneToMany
- 기본적으로 DB 설계상 일대다 관계에서 일인 쪽에 FK가 있을 수 없다. 연관관계의 주인도 마찬가지.
(일 쪽에서 FK를 가지고 있으면 테이블 하나에서 다른 FK 때문에 중복 테이블이 생성되기 때문.)
=> 따라서, 테이블의 일대다 관계는 항상 다(N) 쪽에 외래 키가 있다.
- JPA 표준 스펙에서는 '일대다 '관계 매핑을 지원.
- 연관관계의 주인으로 '다' 쪽 객체를 저장할 변수에 @JoinColumn(name = "'일' 쪽의 PK")를 매핑.
- 기존 다대일 관계보다, 쿼리가 하나 더 발생. (다(N) 쪽의 FK를 UPDATE 해주어야 하기 때문.)
=> 반대편 테이블의 외래 키를 관리하는 형태.
일대다 단점
- 엔티티가 관리하는 외래 키가 다른 테이블에 있음
- 연관관계 관리를 위해 추가로 UPDATE SQL 실행
💡 다대일 양방향 매핑을 사용하는 것을 권장
❓❗ 일대일 [1:1] @OneToOne
- 일대일 관계는 반대도 일대일
- 외래 키를 주 테이블이나 대상 테이블 중에 선택 가능
- 외래 키에 데이터베이스 유니크 제약 조건(UNI) 추가.
- 다대일 관계와 유사.
🎨주 테이블에 외래 키
- 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래키를 두고 대상 테이블을 찾음.
- JPA 매핑 편리
- 장 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단 : 값이 없으면 외래 키에 null 허용
🎨대상 테이블에 외래 키
- 대상 테이블에 외래 키가 존재
- 장 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
- 단 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨.
(주 테이블에서 대상 테이블을 찾기 위해 대상 테이블에 쿼리를 날려야 하기 때문. )
❓❗ 다대다 [N:M] (실무에서 권장되는 관계 매핑이 아님) @ManyToMany
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음.
(연결 테이블을 추가해서 일대다 -> 다대일 관계로 풀어내야함)
- 객체는 컬렉션을 사용하여 객체 2개로 다대다 관계를 표현할 수 있음.
- 편리해 보이지만 실무에서 사용 X
- JPA에서 다대다 관계를 설정하면 내부적으로 중간 테이블이 존재하기때문에, 예상치 못한 쿼리가 나감.
- 중간 테이블에 원하는 컬럼을 추가할 수 없음.
다대다 한계 극복
- 중간 테이블을 Entity로 만들어, @ManyToOne - @OneToMany 관계로 풀어 사용.
==> 기존 Customer - Product 에서 Customer - Order - Product와 같은 형태로 중간 테이블 생성하여 일대다, 다대일 매핑
본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.