'연관관계의 주인'개념을 이해해기 위해서는
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 속성이 지정된 곳에서는 읽기만 가능)
위와 같이 외래키를 관리하는 쪽을 연관관계의 주인으로 하지 않을 경우
아래와 같은 문제가 발생할 수 있다
- 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 |
댓글