연관관계에서 고려해야할 점은 아래와 같다
1. 다중성 - 일대다 / 다대일 / 다대다 / 일대일
2. 방향 - 단방향 / 양방향
3. 연관 관계의 주인
다중성
- 일대다 ( 1: N ) @OnetoMany
- 다대일 ( N:1 ) @ManytoOne
- 다대다 ( N:M ) @ManytoMany
- 일대일 ( 1:1 ) @ OnetoOne
방향
- 단방향 : 한쪽으로 가는 방향
- 양방향 : 양쪽으로 가는 방향
DB 테이블에서는 외래키(FK) 하나로 조인을 사용해서 양방향으로 쿼리가 가능하다.
** DB 에서는 방향이라는 개념이 없다
객체는 방향의 개념이 존재한다.
참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다.
?? 무조건 양방향 관계를 하면 안될까 ??
- 일반적인 비즈니스에서 엔티티들은 서로 많은 연관관계를 갖게 된다.
양방향 관계를 설정하면 불필요한 매핑으로 인해 복잡성이 증가하게 된다.
따라서, 기본적으로는 단방향 매핑으로 설정하고, 역방향으로 꼭 필요하다고 생각될 때 추가하는 것이 좋다.
연관관계의 주인
데이터베이스에서는 외래키(FK) 를 사용해서 두 테이블의 연관관계를 맺는다.
따라서, 연관관계를 관리하는 것은 외래키 하나이다.
JPA 에서는 두 객체 중 하나를 정해서 외래키를 관리하게 하는데,
외래키를 관리하는 객체를 연관관계의 주인 이라고 한다.
대다수는 외래키를 가진 테이블과 매핑되는 엔티티가 외래키를 관리하는 것이 효율적이다.
보통 이곳을 연관관계의 주인으로 선택한다.
수정 및 변경은 연관관계의 주인인 외래키를 가진 곳에서만 가능하며, 주인이 아닌곳은 조회(읽기)만 가능하다.
다대일 ( N : 1 ) 연관관계
team 에는 여러명은 Member 를 가질 수 있으며, Member(1명) 는 하나의 팀에 속하게 된다.
- 단방향
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
양쪽을 서로 참조하게 할 수 있다.
mappedBy 를 사용하며, 조회만 가능하다.
- 양방향
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
일대다 ( 1 : N ) 연관관계 : 다대일 양방향 매핑을 사용하자
- 일대다 ( 1: N ) 에서 일(1) 이 연관관계의 주인
- 테이블 일대다 관계는 항상 다(N) 에 외래키가 존재
** 외래키와 연관관계의 주인은 보통 같지만, 특이한 구조를 가진다.
- @JoinColumn 을 꼭 사용해야 하며, 사용하지 않으면 중간 테이블이 생기게 된다.
- 연관관계 관리를 위해 추가로 Update 쿼리가 실행 -> 복잡해짐.
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
일대일 ( 1 : 1 ) 연관관계
Member 를 연관관계 주인으로 설정
- 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인이 된다.
@OneToOne
@JoinColumn(name = "locker_id")
private Locker locker;
Locker 에서는 mappedBy 를 이용해 양방향으로 매핑한다.
@OneToOne(mappedBy = "locker")
private Member member;
일대일 관계 중 대상 테이블의 외래 키가 있는 단방향 관계는 지원하지 않는다.
다대다 ( N : M ) 연관관계 : 쓰지 않는다.
다대다를 쓰지 않고 중간에 entity를 만들어 연결 엔티티로 승격시켜 해결한다
- 참고
https://ttl-blog.tistory.com/129
https://jeong-pro.tistory.com/231
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'Spring > JPA' 카테고리의 다른 글
JPA 프록시 (1) | 2022.09.26 |
---|---|
상속관계 매핑 ( @Inheritance , @DiscriminatorColumn ) (0) | 2022.09.23 |
연관 관계가 필요한 이유 (0) | 2022.09.21 |
필드와 컬럼 매핑 (0) | 2022.09.20 |
데이터베이스 스키마 자동 생성 (0) | 2022.09.20 |
댓글