[JPA] 양방향 연관관계 주인
✔ 양방향 매핑
- 테이블의 연관관계에는 방향이라는 개념이 존재하지 않는다.
- 기본키와 외래키를 조인하여 양방향으로 접근이 가능하다.
- 객체(Entity)는 참조의 개념을 사용하기 때문에 Id값만 있을 시 양방향 접근이 불가능하다.
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
- 양방향 매핑을 위해 위에서는 @OneToMany(mappedBy = “team”)를 선언
- Member -> Team
- Team -> Member
✔ 연관관계의 주인과 mappedBy
- mappedBy = JPA의 고 난이도
- mappedBy는 처음에 이해하기 어렵다
- 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다
✅ 객체와 테이블이 관계를 맺는 차이
객체는 2개의 관계, 테이블은 1개의 관계
- 객체 연관관계 = 2개
- 회원 -> 팀 연관관계 1개 (단방향)
- 팀 -> 회원 연관관계 1개 (단방향)
- 테이블 연관관계 = 1개
- 회원 <-> 팀의 연관관계 1개 (양방향)
✅ 객체의 양방향 관계
- 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다
- 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다
- A -> B (a.getB())
class A {
B b;
}
- B -> A (b.getA())
class B {
A a;
}
✔ ✅ 테이블의 양방향 연관관계
- 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
- MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계를 가짐 ( 양쪽 조인 가능 )
MEMBER
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
TEAM
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
- 위에서 말하고자 하는 것은 외래키 하나로 어떤 테이블에서도 데이터를 가져올 수 있다는 점
✨ 둘중 하나로 외래 키를 관리해야 한다
- 그렇다면 둘 중에 어떤 걸로 매핑을 해야 할까?
- Member(Entity)로 외래키를 관리할지, Team(Entity)로 관리할지 결정해야 한다.
- 여기서 룰이 생긴다
- DB 입장에서는 TEAM_ID(FK)만 업데이트 되면 된다
✔ 연관관계의 주인
✨ 양방향 매핑 규칙
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래 키를 관리 - 등록, 수정
- 주인이 아닌쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용을 하지 않는다
- 주인이 아니면 mappedBy 속성으로 주인 지정
✨ 누구를 주인으로?
- 외래 키가 있는 곳을 주인으로 정해라.
- 위 사진에서는 Member.team이 연관관계의 주인이다.
- DB에서 1 : N 쪽에 해당되는 곳이 연관관계의 주인이라 생각한다.
댓글남기기