객체 연관관계와 테이블의 연관관계
연관관계 중에서는 N : 1 단방향 관계를 가장 먼저 이해해야 합니다.
지금부터 회원과 팀의 관계를 통해 N : 1 단방향 관계를 알아보겠습니다.
- 회원과 팀이 있습니다.
- 회원은 하나의 팀에만 소속될 수 있습니다.
- 회원과 팀은 N : 1 관계입니다. (다수의 인원이 한팀에 가입할 수 있습니다.)
객체 연관관계
- 회원 객체는 Member.team필드로 팀 객체와 연관관계를 맺습니다.
- 회원 객체와 팀 객체는 단방향 관계입니다.
- 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없습니다.
- 예를 들어 member -> team의 조회는 member.getTeam()으로 가능하지만 반대 방향인 team -> member를 접근하는 필드는 없습니다.
테이블 연관관계
- 회원 테이블은 TEAM_ID 외래키로 팀 테이블과 연관관계를 맺습니다.
- 회원 테이블과 팀 테이블은 양방향 관계입니다.
- 회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있습니다.
- 예를 들어 MEMBER 테이블의 TEAM_ID외래 키 하나로 MEMBER JOIN TEAM 과 TEAM JOIN MEMBER 둘 다 가능합니다.
키하나로 양방향으로 조인하는 SQL문입니다.
// MEMBER이 기준 테이블의 경우
SELECT *
FROM MEMBER M
INNER JOIN TEAM T
ON M.TEAM_ID = T.TEAM_ID
// TEAM이 기준 테이블의 경우
SELECT *
FROM TEAM T
INNER JOIN MEMBER M
ON T.TEAM_ID = M.TEAM_ID
객체 연관관계의 테이블 연관관계의 가장 큰 차이
참조를 통한 연관관계는 언제나 단방향입니다.
객체간에 연관관계를 양방향으로 만들고싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야합니다.
결국 연관관계를 하나 더 만들어야합니다.
이렇게 양쪽에서 서로 참조하는것을 양방향 연관관계라 합니다.
하지만 정확하게 이야기하면 객체의 양방향 연관관계는 올바르지않습니다.
서로 다른 단방향 관계 2개일 뿐입니다.
객체의 단방향, 양방향 연관관계입니다.
// 단방향 연관관계
class A {
B b;
}
Class B {}
// 양방향 연관관계
class A {
B b;
}
Class B {
A a;
}
정리하자면 아래와 같습니다.
- 객체는 참조(주소)로 연관관계를 맺습니다.
- 테이블은 외래키로 연관관계를 맺습니다.
이 둘은 비슷해 보이지만 매우 다른특징을 가집니다.
연관된 데이터를 조회할 때 객체는 참조(a.getB().getC())를 사용하지만 테이블은 조인을 사용합니다.
참조를 사양하는 객체의 연관관계는 단방향입니다.
- A -> B (a,b)
외래키를 사용하는 테이블의 연관관계는 양방향입니다.
- A JOIN B 가 가능하면 반대로 B JOIN A 도 가능합니다.
- 객체를 양방향으로 참조하라면 단방향을 2개 만들어야합니다
- A -> B (a, b) / B -> A (b, a)