객체와 테이블의 연관관계는 매우 다르다.
객체는 참조 하여 연관된 객체를 찾지만
테이블은 외래 키를 매핑(조인)하여 연관된 테이블을 찾는다.
✔️ 단방향 연관관계
@Entity
public class Member {
// 기본 id 및 정보 생략
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
Member 가 Team을 단방향으로만 알고 있는 상태
✔️ 양방향 연관관계
@Entity
public class Member {
// 기본 id 및 정보 생략
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
// 기본 id 및 정보 생략
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
객체의 연관관계는 2개
회원 → 팀 참조(연관관계) 1개 (단방향)
팀 → 회원 참조(연관관계) 1개 (단방향)
테이블 연관관계
회원 ↔ 팀의 연관관계 1개 (양방향)
외래키 하나로 매핑 (연관관계 관리)
객체의 양방향은 사실 서로 다른 단방향 관계 2개이다.
✔️ 연관관계의 주인(Owner)
💠 양방향 매핑 규칙
- 객체의 두 관계중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래 키를 관리(등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능
- 주인이 아니면 mappedBy 속성으로 주인 지정
양방향 연관관계 주의
- 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정
- 연관관계 편의 메소드를 생성
- 양방향 매핑시 무한루프를 조심
- toString(), lombok, JSON 생성 라이브러리
❓ 어느쪽을 연관관계 주인으로 설정해야 할까 ❓
Team을 연관관계 주인으로 설정 후 특정 멤버의 team 변경시
- Team을 통해서 member의 team 변경요청
- member에 update 쿼리를 날려 teamID 변경
- 주인은 Team인데 정작 쿼리는 member에 날라가고 있다..
Member를 연관관계 주인으로 하고 특정 멤버의 team 변경시
- Member에 update 쿼리를 날려 team 변경
다(N)쪽이(FK) 연관관계 주인이 되는게 맞다.
즉, 외래키가 있는 곳을 연관관계 주인으로 설정한다.
✔️ 정리
- 단방향 매핑만으로도 이미 연관관계 매핑은 완료
- 단방향 매핑을 잘하고 양방향은 필요시 추가해도 늦지 않음 (테이블 영향 X)
- 데이터 베이스에서 1 : N 관계는 항상 N 쪽이 FK를 가진다.
연관관계의 주인을 정하는 기준
외래 키의 위치를 기준으로 정해야 함
🔖 학습내용 출처
'Back-End > JPA' 카테고리의 다른 글
JPA - 1:N 단방향과 양방향에 대해서 (0) | 2024.07.09 |
---|---|
JPA - 다양한 연관관계 매핑 (0) | 2024.07.09 |
JPA - 엔티티 매핑 (0) | 2024.07.05 |
JPA - 영속성 관리 (0) | 2024.07.01 |
JPA 소개 (0) | 2024.07.01 |