(7) 정리
양방향 매핑
1. 연관관계의 주인을 정해줘야 한다.
항상 "다(N)" 쪽이 주인이 된다. ->
@ManyToOne
어노테이션이 붙는 곳이 주인주인 쪽에서는
@JoinColumn(name = ~)
으로 매핑되는 엔티티의 ID 컬럼명을 넘겨준다.주인이 아닌 곳은
mappedBy
로 표시해준다.
2. 연관관계의 주인이 아니면 읽기만 가능하다.
3. 연관관계의 주인만이 데이터를 변경시킬 수 있다.
4. 순수한 객체까지 고려하여 연관관계를 매핑해준다.
주인이 아닌 쪽에서도 데이터를 추가해준다.
객체 관점에서 양쪽에 데이터를 추가해주지 않으면 에러가 발생할 수 있기 때문
5. 양방향의 장점은 반대방향으로도 객체 그래프 탐색 기능이 추가되었다는 것
- 이전까지는 단방향 참조로 객체 그래프 탐색이 가능했음
6. 양방향 연관관계 매핑 시 연관관계 편의 메소드를 작성하여 사용한다.
실수할 가능성을 줄이기 위해 양쪽 객체에 추가해주는 작업을 하나의 메소드로 관리한다.
다(N) 쪽 연관관계 편의 메소드 로직에서 만약 기존 관계가 있다면 제거해주는 로직을 작성한다.
7. 다대일 연관관계에서 꼭 양방향일 필요는 없다.
만약 한 쪽에서만 참조할 경우 단방향 다대일 연관관계를 사용하면 된다.
굳이 양방향을 쓰지 않아도 된다.
양쪽에 다른 엔티티의 참조를 가지면 양방향
한쪽에만 다른 엔티티의 참조를 가지면 단방향
단방향 다대일의 경우, 다(N) 쪽에 다른 엔티티를 가지며
@ManyToOne
을 가지지만 (1) 쪽에서는 다(N) 쪽 엔티티를 갖지 않는다. (양방향이 아니니까)다(N) 쪽에서
@ManyToOne
이 붙고@JoinColumn
을 한다고 해서 일(1) 쪽에서 항상@OneToMany
를 붙여주는건 아님!!! (여태 잘못 알고있었다...)
연관관계의 주인을 정하는 기준
연관관계의 주인은 외래 키의 위치와 관련해서 정해야지, 비즈니스 중요도로 접근하면 안된다.
ex) 자동차의 차체와 바퀴에서 바퀴가 외래 키가 있는 다쪽이다.
내 생각을 정리하자면,
외래 키가 있다는 말은 엔티티 내부에 다른 엔티티를 참조하는 객체를 포함하고 있고, 이것은 사실 단방향 매핑을 의미하며 다른 엔티티(테이블)의 외래 키를 가지고 있다는 것으로 해석된다.
그래서 다대일 관계에서 보면, 다(N) 쪽은 엔티티 자체를 필드로 갖지만, 일(1) 쪽은 컬렉션으로 다쪽의 엔티티를 보관한다. 따라서 컬렉션을 필드로 갖는 일(1) 쪽은 연관관계에서 주인이 될 수 없고, 단지 mappedBy로 컬렉션 내부 엔티티들의 조회만 가능한 것이다
따라서 다쪽이 항상 외래 키(참조 엔티티 필드) 를 갖기 때문에 연관관계에서 주인이 되고, 간단히 정리하자면
@ManyToOne
이 붙는 쪽이 주인이 된다고 생각할 수 있을 것 같다.