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개로 이루어져 있기 때문에.. 어떤 값이 수정됨에 따라 외래키를 수정해야 하는 건지..
그래서 연관관계의 주인을 정해야 한다.
연관관계의 주인(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 |