이번에는 매핑에서 각 엔티티 간 연관 관계 설정과 상속인 경우 매핑하는 방법에 대해 정리해보았습니다!
📌 연관 관계 매핑
-
용어
- 방향(Direction): 단방향, 양방향
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해
- 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요
-
객체와 테이블이 관계를 맺는 차이
- 테이블의 연관 관계 1개(양방향) = 객체 당 연관 관계 2개(단 방향 2)
-
양방향 매핑 규칙
- 연관관계의 주인만이 외래 키를 관리
- 주인X : mappedBy 속성 사용
-
연관 관계 매핑 시, 고려사항 3가지
- 단방향, 양방향
- 연관관계의 주인
- 다중성
-
다대일: @ManyToOne
-
일대다: @OneToMany → 1이 연관관계 주인
↔ 테이블 일대다 관계는 다 쪽에 외래 키
⇒ @JoinColumn 사용으로 중간에 테이블 추가 방지
-
일대일: @OneToOne → 외래 키가 있는 곳이 연관관계의 주인
- 주 테이블에 외래 키 : 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음 → 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 대상 테이블에 외래 키 → 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지, 그러나 지연 로딩 불가
-
다대다: @ManyToMany & @JoinTable(연결 테이블 지정)
- 정규화된 테이블 2개로 다대다 관계를 표현 불가능 함 → 연결 테이블을 추가해서 일대다, 다대일 관계로 표현함
- 객체는 컬렉션을 사용으로 다대다 관계 가능
⇒ 실전에서는 중간 테이블이 복잡해서 사용x
📌 상속 관계 매핑
1. 조인 전략 : 각각 테이블로 변환
- 장점 : 테이블 정규화, 외래 키 참조 무결성 제약조건 활용, 저장 공간 효율화 가능
- 단점 : 조인을 많이 사용하면 성능 저하, 조회 쿼리 복잡, 데이터 저장시 쿼리 2번
2. 단일 테이블 전략 : 통합 테이블로 변환
- 장점 : 조회 성능이 빠르고, 조회 쿼리가 단순함
- 단점 : 자식 엔티티가 매핑한 컬럼은 모두 null 허용하고, 단일 테이블에 모든 것을 저장해서 테이블이 커질 수 있음
3. 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환
- 장점 : 서브 타입을 명확하게 구분해서 처리할 때 효과적이며, not null 제약조건 사용 가능
- 단점 : 여러 자식 테이블을 함께 조회할 때는 UNION 쿼리로 성능이 느리고, 자식 테이블 통합해서 쿼리하기 어려움 ⇒ 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
위 내용을 구현하기 위해 @Inheritance(strategy=InheritanceType.XXX) 이용