
객체 연관관계
Member.team 필드로 팀 객체와 연관관계를 맺는다.Member.team필드를 통해 팀을 알 수 있지만, 반대로 팀은 회원을 알 수 없다.테이블 연관관계
TEAM_ID 외래키로 팀 테이블과 연관관계를 맺는다.TEAM_ID 외래키를 통해 회원과 팀을 조인할 수 있고,
반대로 팀과 회원도 조인할 수 있다.sql SELECT * FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID --반대도 가능객체 연관관계와 테이블 연관관계의 가장 큰 차이
참조를 통한 연관관계는 언제나 단방향이다.
객체간의 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해 참조를 보관해야 한다.
결국 연관관계를 하나 더 만들어야 한다. (양방향 연관관계)
정확히 말하면 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.
반면 테이블은 외래키 하나로 양방향으로 조인할 수 있다.
//양방향 연관관계 class A{ B b;} class B{ A a;} ```
객체 연관관계 vs 테이블 연관관계 정리
다른 특징을 가지는데, 연관 데이터를 조회할 때하지만 한다. - 객체는 참조(주소) 로 연관관계를 맺는다. - 테이블은 외래키로 연관관계를 맺는다.
객체는 참조를 사용
테이블은 조인을 사용
- 참조를 사용하는 객체의 연관관계는 단방향이다.
A -> B (a.b)
- 외래키를 사용하는 테이블의 연관관계는 양방향이다.`A JOIN B`가 가능하면 `B JOIN A` 도 가능하다.
- *객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.*`A -> B (a.b)` / `B -> A (b.a)`
//JPA를 사용하지 않은 순수한 회원과 팀 클래스@Datapublic class Member{ private String id; private String username; private Team team; //팀의 참조를 보관}@Datapublic class Team{ private String id; private String name1}//동작 (회원1과 회원2를 팀1에 소속)public static void main(String[] args){ Member member1 = new Member("member1", "회원1"); Member member2 = new Member("member2", "회원2"); Team team1 = new Team("team1", "팀1"); member1.setTeam(team1); member2.setTeam(team1); Team findTeam = member1.getTeam();}
회원1과 회원2는 팀1에 소속했다.
Team findTeam = member1.getTeam() 을 이용해 회원1이 속한 팀1을 조회할 수 있다.
객체는 참조를 사용해서 연관관계를 탐색할 수 있는데 객체 그래프 탐색이라고 한다.
데이터베이스 테이블의 회원과 팀의 관계