참고
해당 글은 김영한님의 자바 ORM 표준 JPA를 공부하며 작성한 글입니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
다대일[N:1]
다대일 단방향
- 가장 많이 사용하는 연관관계
다대일 양방향
- ‘다(many)’ 쪽에 외래 키가 가게되고, 연관관계의 주인이 된다.
- 양쪽을 서로 참조하도록 개발한다.
일대다[1:N]
일대다 단방향
- 테이블 일대다 관계는 항상 항상 다(N)쪽에 외래키가 있으므로, 객체와 테이블의 차이때문에 반대편 테이블의 외래 키를 관리하게 되는 특이한 구조가 생겨나게 된다.
@JoinColumn
을 꼭 사용해야 한다. 그렇지 않으면 조인 테이블 방식을 사용한다.
→ 테이블과 테이블 사이의 중간테이블이 생성됨
단점
- 엔티티가 관리하는 외래 키가 다른테이블에 존재하게 되고, 이로 인한 연관관계 관리를 위해 UPDATE SQL이 추가로 실행되게 되므로 성능 저하가 일어날 수 있다.
- 일대다 단방향 매핑보다 다대일 양항뱡 매핑을 사용할 것.
일대다 양방향
- 공식적으로 존재 하지 않는 매핑
@JoinColumn(insertable=false, updatable=false)
→ 다른 컬럼과 조인을 하되, 값을 넣거나 업데이트를 막아서 읽기 전용 속성으로 만들어 강제적으로 연관관계의 주인이 되지 못하게 하는 방법이다.- 다대일 양방향을 사용할 것
일대일[1:1]
특징
- 일대일 관계는 그 반대도 일대일 인 대칭적인 관계이다. → 일대다, 다대일과 다르게 주 테이블과 대상 테이블 중 아무대나 외래키가 존재 해도 된다.
- 주 테이블에 외래키가 있는경우
- 대상 테이블에 외래 키가 있는경우
- 보통 외래 키애 데이터베이스 유니크(UNI) 제약조건이 있어야 일대일 관계가 성립이 가능하다. (유니크 제약조건이 없는경우 관리가 매우 어렵기 때문)
일대일 : 주 테이블에 외래키 단방향 및 양방향
- 다대일(
@ManyToOne
) 매핑과 매우 비슷하다. - 다대일과 마찬가지로 반대편은 mappedBy를 적용한다.
일대일 : 대상 테이블에 외래 키 양방향
- 단방향 관계는 JPA에서 지원하지 않는다.
- 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같다.
일대일 매핑 정리
주 테이블에 외래 키가 있는 경우
- 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾는다.
- 객체지향 개발자 선호
- JPA 매핑 편리
- 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점 : 값이 없으면 외래 키에 null 허용
대상 테이블에 외래 키가 있는 경우
- 대상 테이블에 외래 키가 존재
- 전통전인 데이터베이스 개발자 선호
- 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경시 테이블 구조가 유지된다.
- 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨
다대다 [N:M]
관계형 데이터베이스에서는 정구화된 테이블 2개로 다대다 관계를 표현할 수 없으므로, 중간에 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내게 된다.
@ManyToMany
를 사용하고,@JoinTable
로 연결 테이블을 지정한다.
다대다 매핑의 한계
- 연결 테이블에서는 단순히 연결만 하고 끝나지 않고, 멤버와 상품간 매핑시 주문시간, 수량같은데이터가 들어 갈 수 있다.
한계 극복
- 연결 테이블용 엔티티를 추가 (연결 테이블을 엔티티로 승격)
@ManyToMany
→@OneToMany
,@ManyToOne
정리
@JoinColumn
- 왜래키 매핑시 사용
속성 | 설명 | 기본값 |
name | 매핑할 외래 키 이름 | 필드명 |
referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본키 컬럼명 |
foreignKey(DDL) | 외래 키 제약조건을 직접 지정 테이블을 생성할때만 사용 |
|
unique nullable insertable updatable columnDefinition table |
@Column의 속성과 같음 |
@ManyToOne
- 다대일 관계 매핑
속성 | 설명 | 기본값 |
optional | false로 설정시 연관 엔티티가 항상 존재해야 함 | TRUE |
fetch | 글로벌 페치 전략을 설정 | - @ManyToOne : FetchType.EAGER - @OneToMany : FetchType.Lazy |
cascade | 영속성 전이 기능을 사용 | |
targetEntity | 연관된 엔티티의 타입 정보 설정 | |
거의 사용하지 않음 |
@OneToMany
- 일대다 관계 매핑
속성 | 설명 | 기본값 |
mappedBy | 연관관계의 주인 필드를 선택 | TRUE |
fetch | 글로벌 페치 전략을 설정 | - @ManyToOne : FetchType.EAGER - @OneToMany : FetchType.Lazy |
cascade | 영속성 전이 기능을 사용 | |
targetEntity | 연관된 엔티티의 타입 정보 설정 거의 사용하지 않음 |
다대다 매핑은 일대다, 다대일로 풀어내자
- 중간테이블 대신 중간 엔티티를 만들어서 사용
@ManyToMany
대신 중간테이블에@OneToMany
,@ManyToOne
를 이용해서 매핑하기
반응형