
연관관계 필요성
- table은 외래 키로 join을 사용해서 연관된 테이블을 찾음
- 객체는 참조를 통해 연관된 객체를 찾음.
양방향 연관관계와 연관관계의 주인
- table은 단방향이랑 다르지 않음. 외래키를 사용하기에 사실상 방향이란 개념이 없음.
객체와 테이블의 관계를 맺는 차이
- 객체 연관관계(회원, 팀 예제)
회원 -> 팀 연관 관계(단방향)
팀 -> 회원 연관 관계(단방향)
- 사실상 양방향이라기 보다는 단반향 두개
- 테이블 연관관계
연관관계의 주인(Owner)
- 위의 문제를 해결하기 위해 양방향 중 하나를 주인으로 지정
설계시 주의
- 단방형으로만 설계하는 것으로 연관관계는 완료. -> 양방향은 반대방향으로 조회할 일이 생길 때 추가된 것임.
- 따라서 단방향 설계 -> 참조가 필요할 때마다 양방향 추가.
다양한 연관관계 mapping
- mapping 시 고려사항
- 다중성 (다대일, 일대다, 일대일, 다대다)
- 단방향, 양방향
- 연관관계 주인
다대일 [N:1]
- 단방향
- 다대일 반대는 일대다
- 다(N)쪽에 외래키가 있음.
- 양방향
- 외래키가 있는 곳이 주인 -> 다(N)이 주인
일대다 [1:N]
- 단방향
- 일(1)이 연관관계 주인
- table에서는 다(N)에 외래키가 있음. -> 패러다임 차이로 발생
@JoinColumn 필수
- 단점
- entity가 관리하는 외래 키가 다른 테이블에 있음
- 다대일 양방향 매핑을 사용을 권장.
- 양방향
- 공식적인 방법은 X
@JoinColumn(insertable=false, updatable=false)
- insert과 update를 막아 읽기 전용으로 강제로 만듬.
일대일 [1:1]
- 주 테이블이나 대상 테이블 중에 외래 키 선택 가능
- 주 테이블 외래키
- 단방향
다대일(@ManyToOne) 단방향과 유사(코드적으로)
- 양방향
- 다대일 양방향처럼 외래 키가 있는 곳이 연관관계의 주인
- 반대편은
mappedBy 적용
- 대상 테이블에 외래 키
다대다 [N:M]
- 객체는 다대다 가능, 관계형 데이터베이스의 정규화된 테이블 다대다 불가능
- 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함
@JoinTable로 연결 테이블 지정
- 실무에서 사용 X
- 다대다 한계 극복
상속관계 mapping
- 관계형 데이터베이스는 상속관계 X
- 슈퍼타입 서비타입 관계 모델링 기법이 유사한 함
- 상속 mapping = 슈퍼타입 서브타입 mapping
조인 전략
- 개념
- entity 각각을 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아 기본 키 + 외래 키로 사용하는 전략
- 자식 테이블 중 어느 테이블을 조회해야하는지 구분하기 위해 DTYPE이란 구분 컬럼을 사용한다
@Inheritance(strategy=InheritanceType.JOINED)
- 정석적인 방법
- 장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
- 단점
- 조회시 조인을 많이 사용 -> 성능저하
- 조회 쿼리가 복잡함
- 데이터 저장시 INSERT SQL 2번 호출
단일 테이블 전략
- 개념
- 하나의 table에 구분 컬럼(DTYPE)을 활용해 데이터를 활용하는 전략
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
- 장점
- 조인이 필요 X -> 조회 성능이 빠름
- 조회 쿼리가 단순함
- 단점
- 자식 entity가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든것을 저장 -> 테이블이 커짐 -> 조회 성능이 느려질 수 있음.
구현 클래스마다 테이블 전략
- 개념
- 구현 entity를 모두 테이블로 만듬.
- 쓰면 안 되는 전력
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
- 장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
- 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어려움
@MappedSuperclass
- 공통 mapping 정보가 필요할 때 사용 -> 공통적인 컬럼이 정보
- 특징
- 상속관계 매핑X
- entity X, 테이블과 mapping X -> 테이블이 생기지 않음.
- 부모 클래스를 상속 받는 자식 클래스에 mapping 정보만 제공
- 조회, 검색 불가
- 추상 클래스 권장
@Entity, @MappedSuperclass가 있어야 상속 가능
참조
- 인프런 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
- 링크