Lined Notebook

[Spring Data JPA] 12. JPA 양방향 연관관계의 주인

by ymkim

✔ 양방향 매핑

  • 테이블의 연관관계에는 방향이라는 개념이 존재하지 않는다.
    • 기본키와 외래키를 조인하여 양방향으로 접근이 가능하다.
  • 객체(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 쪽에 해당되는 곳이 연관관계의 주인이라 생각한다.

참고 자료

블로그의 정보

기록하고, 복기하고

ymkim

활동하기