본문 바로가기

Dev/JPA

RS) 양방향 연관관계와 연관관계의 주인

JPA에서 크게 중요한 두가지 포인트를 꼽자면..

영속성 컨텍스트의 메커니즘 이해와 양방향 연관관계와 연관관계의 주인이 어려운 부분이다!


양방향 매핑

코드를 통해 양방향 매핑에 대해서 집어보고 이해하자

// Member에서 Team으로 가는 것은 오케이
// 그렇다면 Team에서 Member로 가는 것은?? 불가능
Team findTeam = findMember.getTeam();
findTeam.getMember() // Team에서 Member로 가는 것은 불가능하다.
System.out.println("findTeam = " + findTeam.getName());

양방향 연관관계

  • 위 그림에서 테이블 연관관계는 양방향으로 연관관계가 달라져도 그림이 달라질 게 전혀 없다.
  • 테이블 연관관계에서는 JOIN을 통해 서로간의 정보를 알 수 있기 때문이다.
  • 테이블 연관관계는 외래키 하나로 양방향이 다 된다는 것이다. 

TEAM 엔티티 코드 수정

  • 아래와 같이 설정하게 되면, 양방향으로 다 탐색할 수 있게 된다.
@Entity
public class Team {

    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    private String name;
	
    // TEAM 입장에서는 일대 다 이기 때문에 OneToMany 어노테이션 사용
    // mappedBy 옵션을 사용해서 대상이 되는 컬럼을 지정해준다.
    // MEMBER 엔티티에 Team team 컬럼이 대상이 됨으로 여길 지정
    @OneToMany(mappedBy = "team") 
    private List<Member> members = new ArrayList<>();
    
    public List<Member> getMembers() {
    return members;
    }

    public void setMembers(List<Member> members) {
        this.members = members;
    }

연관관계의 주인과 mappedBy

  • mappedBy = JPA의 가장 어려운 난이도
  • 처음에는 이해하기 어려움으로 객체와 테이블이 관계를 맺는 차이를 이해해야 한다.

객체와 테이블이 관계를 맺는 차이

위에서 두개의 엔티티 MEMBER와 TEAM의 관계의 차이를 알아보면

  • 객체 연관관계 = 2개 (단방향 연관관계 2개)
    • 회원 → 팀 연관관계 1개(단방향)
    • 팀 → 회원 연관관계 1개(단방향)
    • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다.
    • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
  • 테이블 연관관계 = 1개
    • 회원 ↔ 팀의 연관관계 1개(양방향) 
    • 어떻게 보면 방향이 없는 것이다. 
    • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
    • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계를 가질 수 있다

테이블 연관관계에서의 양방향 관계(외래키로 컨트롤)


그렇다면 어떻게 할 경우에 외래키를 업데이트 해야할지가 고민이다!

단방향 연관관계가 2개로 이루어져 있기 때문에.. 어떤 값이 수정됨에 따라 외래키를 수정해야 하는 건지..

그래서 연관관계의 주인을 정해야 한다. 

연관관계의 주인(TEAM? MEMBER?)

연관관계의 주인(Owner)

양방향 매핑 규칙

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용X
  • 주인이 아니면 mappedBy 속성으로 주인 지정
  • 여기서는 MEMBER에 Team을 주인으로 할지 아니면 TEAM에 members를 주인으로 할지 정해야한다는 뜻

누구를 주인으로 할 것인가?

  • 외래 키가 있는 곳을 주인으로 정하자
  • 여기서는 Member.team이 연관관계의 주인
  • mappedBy를 거는 쪽은 주인의 반대편인 Team에다 걸어야 한다.
  • MEMBER는 진짜 매핑 TEAM은 가짜 매핑이라고 한다.
  • MEMBER는 N이고 TEAM은 1인데 N쪽이 보통 연관관계의 주인이 된다. 
    • 다대일 관계에서 보통 다(N)쪽이 연관관계의 주인이 되면 된다.

그림참조

'Dev > JPA' 카테고리의 다른 글

RS) 다대다 관계  (0) 2022.02.17
RS) 연관관계 매핑시 주의할 점  (0) 2022.02.15
RS) 연관관계 매핑 기초  (0) 2022.02.06
RS) 실전예제를 통한 문제점 분석  (0) 2022.02.06
RS) 기본키 매핑  (0) 2022.02.03