연관관계의 주인이 '다'쪽에 있는 이유에 대해 살펴보자. 이를 위해 먼저 객체지향세계와 DB의 차이에 대해 알아야 한다.
🔍 객체지향과 DB, 연관관계의 주인이 필요한 이유
Member와 Team이라는 클래스 또는 테이블이 있다고 해보자. 여기서 이 둘은 다대일 단방향 관계이다. 객체지향에서 Member Team은 다음과 같이 표현될 수 있다.
public class Member {
int id;
String memberName;
Team team;
}
public class Team {
int id;
String teamName;
}
RDBMS에서는 다음과 같이 표현이 된다.
DB와 객체지향의 큰 차이점은 객체지향 프로그래밍에서는 Member에서 Team으로의 조회는 가능하지만, Team에서는 Member의 조회가 불가능 하다. 반면에 DB는 '외래키'라는 것을 이용해 Team에서도 Member를 조회할 수 있다. JPA에서는 이런 '외래키'의 개념의 공백을 채우기 위해서 연관관계의 주인이라는 말이 등장했다.
🔍 연관관계의 주인이 '다'에 있는 이유
1. PK의 중복
Team에 외래키가 있고, 멤버 여러명이 teamA에 속하고 있다고 가정해보자. 테이블의 데이터는 다음과 같이 표현 될 수 있다.
ID (PK) | 팀 이름 | 멤버 ID |
1 | teamA | 1 |
1 | teamA | 2 |
1 | teamA | 3 |
PK가 중복으로 등장한다는 문제가 있다.
2. 쿼리문의 복잡성 증가
PK가 중복이 되기 때문에 데이터베이스의 구조는 다음과 같을 것이다.
여기서 Team이 연관관계의 주인이 된다고 가정하고 members안에 들어있는 멤버1의 이름을 바꿔보자.
public class Member {
int id;
String memberName;
Team team;
}
public class Team {
int id;
String teamName;
List<Member> members;
}
Team에 있는 members의 id가 변경되는 것이 아니라 Member 테이블의 memberName이 변경된다.
이런 쿼리는 나중에 디버깅이 어렵게 만들며 성능이슈의 여지가 생기게 된다.
🔍 결론
1. 일대다, 다대일 관계에서 연관간계의 주인은 '다'쪽에 있다.
2. '다' 쪽에 있어야 하는 이유
- 쿼리문이 다른 테이블에서 실행된다.
- PK의 중복 문제가 있다.