강의 및 책 내용 정리/자바 ORM 표준 JPA 프로그래밍
다양한 연관 관계 기초
소나무나무
2021. 7. 24. 18:34
다대일(N:1) 관계
- 가장 많이 사용하는 연관관계
@ManyToOne
일대다(1:N) 관계
- 일(1)이 연관관계 주인
- 일대다 관계는 항상 다 쪽에 외래키가 존재
- 객체와 테이블의 차이 때문에 반대편 테이블에서 외래키를 관리하는 구조
@JoinColumn
을 꼭 사용해야함. 그렇지 않으면 중간에 테이블을 하나 추가함- 단점
- 엔티티가 관리하는 외래키가 다른 테이블에 있음
- 추가로 Update sql를 실행해야함
- 다대일 양방향 매핑을 사용하자
일대다 양방향 매핑
- 공식적으로 존재하지 않는 매핑
@ManyToOne
에는mappedBy
가 없어서 대신@JoinColumn(insertable=false, updatable=false)
를 사용하여 읽기 전용 필드 만듬- 그냥 다대일 양방향 사용하자
일대일(1:1) 관계
- 일대일 관계는 그 반대도 일대일
- 주 테이블이나 대상 테이블 중에 외래키 선택 가능
- 외래키에 유니크 제약조건 추가한 것
- 주 테이블 외래키 단방향 관계 O, 대상 테이블 외래키 단방향 관계 X
주테이블에 외래키
- 주 객체가 대상 객체의 참조를 가지는 것처럼, 주 테이블에 외래키를 두고 대상테이블 찾음
- 외래키가 있는 곳이 연관관계 주인이고 반대편은
mappedBy
적용 - 객체지향 개발자가 선호
- 장점
- 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능(성능)
- JPA 매핑 편리
- 단점
- 값이 없으면 외래키에 NULL 허용
대상 테이블에 외래키
- 대상 테이블에 외래키가 존재
- 대상 테이블에서 외래키 단방향을 사용하려면 양방향이 필수
- DBA가 선호
- 장점
- 주 테이블과 대상 테이블을 일대일에서 일대다로 변경할 때 테이블 구조 유지(확장 용이)
- 단점
- 지연 로딩으로 설정해도 항상 즉시 로딩됨
다대다(N:M)
- RDB는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음
- 객체는 컬렉션을 이용해서 객체 2개로 다대다 관계 가능함
- 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어야함
@ManyToMany
사용,@JoinTable
로 연결 테이블 지정- 실무에선 사용 X
- 연결 테이블이 단순 연결만 해서 끝낼 일이 아님(JPA에서 만들어주는데 한계가 있음)
- 주문시간, 수량 같은 연결 엔티티에만 사용할 수 있는 데이터가 들어갈 수 있음
Member_Product처럼 외래키를 묶어서 기본키로 사용하면 제약조건 추가할 땐 편하지만 유연성이 떨어지고 JPA 매핑이 간결하지 않다. 비즈니스적으로 의미없는 값을 만들어서 기본키로 사용하는 것을 권장한다.