본문 바로가기
Spring/JPA

양방향 연관관계 - 연관관계의 주인

by YellowCow 2023. 3. 12.

'연관관계의 주인'개념을 이해해기 위해서는

DB와 JPA에서의 외래키 관리방법의 차이점에 대해서 알아야 한다

 

예를 들어, Department와 Employee라는 테이블이 있다고 치자

 

Department와 Employee는 1:N의 관계이다

 

외래키 관리방법의 차이점

DB

DB의 경우에는 N의 관계에 있는 Department에 외래키를 저장하여 관리한다

Department에 저장된 외래키 하나로 양방향 접근이 가능하다

 

JPA

JPA의 경우 양방향 접근이 가능하려면

Department와 Employee 양 쪽 모두에 서로의 참조값이 있어야 한다

 

 

DB의 경우에는 외래키(참조값)를 한 쪽에서만 저장하고 있어서

외래키(참조값)를 관리하는 주체가 명확하다

-> N의 관계에 있는 테이블의 컬럼에 외래키를 저장하고 관리한다

 

JPA의 경우 양방향으로 접근하기 위해서는

양쪽 모두에 서로의 참조 값을 가지고 있어야 하므로

어느 쪽에서 외래키를 관리해야 할 지 명확하지 않다

 

그래서, 외래키를 관리할 엔티티(테이블)를 정해야 하는데

외래키를 관리할 엔티티의 속성(컬럼)을 연관관계의 주인이라고 하고

 

외래키를 관리할 엔티티의 속성(컬럼) 정하는 것

연관관계의 주인을 정한다라고 한다

 

연관관계의 주인 정하는 방법

  • 외래키가 있는 곳을 주인으로 정해라
    • 아래 ERD를 보면 Employee의 DEPT_ID로 외래키를 관리하고 있다
    • 따라서 Employee의 DEPT_ID와 매핑되는 Employee.department가 연관관계의 주인이 된다
    • 연관관계의 주인이 아닌 쪽에서 "mappedBy"속성으로 연관관계의 주인을 지정한다
      (mappedBy 속성이 지정된 곳에서는 읽기만 가능)

ERD에서는 Employee의 외래키인 DEPT_ID가 연관관계의 주인이라 볼 수 있다.
Entity에서의 연관관계의 주인은 Emplyee의 department이다
연관관계의 주인을 지정한 모습

 

위와 같이 외래키를 관리하는 쪽을 연관관계의 주인으로 하지 않을 경우

아래와 같은 문제가 발생할 수 있다

  • Department의 속성 값을 변경했는데 Employee에 Update 쿼리가 나감
    -> 추후, 디버깅에 어려움이 생길 수 있음
  • employee 참조값을 변경하기 위해,
    리스트로 된 employees에서 변경하고자 하는employees를 찾고 변경하는 과정에서 성능저하 발생

 연관관계의 주인을 정할 때는 외래키를 관리하는 엔티티의 속성을 기준으로 정하자

 

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

연관관계 - @ManyToOne  (0) 2023.03.17
양방향 연관관계 주의점  (0) 2023.03.15
연관관계 - 양방향 연관관계(기본 컨셉)  (0) 2023.03.07
연관관계 - 단방향 연관관계  (0) 2023.02.28
Entity-Table 매핑 - 기본키 매핑  (0) 2023.02.24

댓글