<aside> 💡
연관관계란 하나의 객체가 다른 객체를 참조(소유)하는 관계를 의미한다. 즉, A객체가 B객체를 “알고있는 것” 또는 “A가 B를 가지고있는 것” 을 의미한다.
보통 다대다 관계는 1:N, N:1 관계로 구성하고, 연결 테이블이 각 테이블의 PK를 FK로 참조한다고 볼 수있다.
</aside>
Member 테이블과 Product 테이블이 있다고 가정 했을 때 한명의 회원은 여러개의 상품을 찜 할 수 있고, 한개의 상품은 여러명의 회원에게 찜 당할 수 있다.
<aside> 💡
객체와 테이블간의 연관관계를 맺는 차이를 이해해야한다.
회원 ↔ 팀 연관관계 (양방향)
객체간 연관관계에서는 각각 단방향 연관관계로 서로를 참조하고있다. Member에서는 Team의 객체로, Team에서는 Member를 List형태로 저장해서 참조한다.
반면, 테이블에서는 MEMBER에서는 TEAM_ID(FK)로, TEAM에서는 TEAM_ID(PK)로 서로를 JOIN하는 형식이다. 외래키 하나로 참조가 가능해진다.
</aside>
객체
A → B (a.getB())
B → A (b.getA())
class A {
B b;
}
class B {
A a;
}
테이블
테이블은 외래키 하나로 두 테이블의 연관관계를 관리한다.
MEMBER.TEAM_ID 외래키 하나로 양방향 연관관계를 가진다.(양쪽으로 조인 가능하다.)
SELECT * FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT * FROM TEAM T JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
<aside> 💡
위 문제들 때문에 룰이 생기는데 이게 바로 “연관관계의 주인” 이다. 둘 중 하나가 연관관계의 주인으로 설정이 되야한다.
</aside>
외래키가 있는 곳을 주인으로 정해라