연관관계 매핑을 JPA 계의 포인터라고도 한다. 낙오의 갈림길이라는 의미이다. 연관관계의 개념을 정확히 알지 못한 채 프로젝트를 진행하다 보니 헷갈리는 부분이 너무 많아서 기본 개념을 확립해야겠다는 생각이 들었다.
연관관계 매핑
객체는 참조(주소)를 사용해서 관계를 맺고, 테이블은 외래 키를 사용해서 관계를 맺는다.
이 둘은 완전히 다른 특징을 가진다. 객체 관계 매핑에서 가장 어려운 부분이 바로 객체 연관관계와 테이블 연관관계를 매핑하는 일이며 이를 연관관계 매핑이라 한다.
객체 연관관계와 테이블 연관관계의 가장 큰 차이
- 참조를 통한 연관관계는 항상 단방향이다. 객체의 양방향 관계는 사실 서로 다른 단방향 관계 2개이다.
- 반면, 테이블은 외래 키 하나로 양방향으로 JOIN할 수 있다. 테이블의 양방향 연관관계는 외래 키 하나로 두 테이블의 연관관계를 관리하는 것이다.
연관관계의 주인(Owner) 개념을 도입.
엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나이다. 따라서 둘 사이에 차이가 발생하며,이런 차이로 인해 JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야 하며 이것을 연관관계의 주인(Owner)라고 한다.
연관관계의 주인을 정하는 기준
단방향은 항상 외래 키가 있는 곳을 기준으로 매핑하면 된다. 하지만 양방향은 연관관계의 주인이라는 이름으로 인해 오해가 있을 수 있다. 비즈니스 로직상 더 중요하다 해서 주인이 되는 것이 아니라 외래 키 관리자 정도의 의미로 주인을 선택해야 한다. 예시로, 회원과 팀 엔티티는 외래 키가 있는 다 쪽인 회원이 연관관계의 주인이 된다.
객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다. 주인을 명시하는 방법이 바로 mappedBy 속성이다. mappedBy 속성은 양방향 매핑일 때 사용하며, 반대쪽 매핑의 필드 이름을 값으로 주면 된다.
양방향 매핑 규칙
- 무조건 객체의 두 관계중 하나를 연관관계의 주인으로 지정.
- 연관관계의 주인만이 외래키를 관리(등록, 수정)
- 외래키가 있는 곳이 연관관계의 주인이다.
- 주인이 아닌 쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용X
- 주인이 아니면 mappedBy 속성으로 주인을 지정해줌.
그렇다면 누구를 주인으로 지정?
- 외래 키가 있는 곳을 주인으로 정하라 (불문율)
양방향 매핑 시 연관관계의 주인에 값을 입력해야 한다.
추가적으로, 순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 한다.
양방향 매핑의 장점, 양방향 매핑을 하는 이유.
- 단방향 매핑만으로도 이미 연관관계 매핑은 완료되지만,
- 양방향 매핑은 반대 방향으로도 조회(객체 그래프 탐색) 기능이 추가된 것일 뿐.
- 실무에서 JPQL을 통해 역방향으로 탐색할 일이 많음.
- 단방향 매핑을 잘하고 양방향은 필요할 때 추가해도 됨. 양방향을 추가하는 과정은 테이블에 영향을 주지 않기 때문.
'Study > Spring' 카테고리의 다른 글
[트러블슈팅] NCP SENS API 호출 시, 401 Unauthorized 에러 (0) | 2023.11.08 |
---|---|
네이버 SENS API 사용 방법(feat. Feign Client) (1) | 2023.11.08 |
IoC와 DI (0) | 2022.06.24 |
싱글톤 패턴 (0) | 2022.06.23 |
게시판에 사용한 HTML 정리(feat. thymeleaf) (0) | 2022.01.16 |