객체는 참조(주소)를 사용해서 관계를 맞고 테이블은 외래 키를 사용해서 관계를 맺는다. 이 둘은 완전 다른 특징을 갖게되고 이로 인해 객체와 테이블을 매핑해야한다. 객체 관계 매핑에서 가장 어려운 부분이 객체 연관관계와 테이블 연관관계를 매핑하는 일이다.
다음과 같은 테이블이 있다고 해보자. MEMBER (N) : TEAM (1) 일 때, 테이블 연관관계는 다음과 같이 나타낼 수 있다. 이를 연관관계가 없는 객체로 나타내려면 어떻게 할 수 있을까?
연관관계가 없는 객체로 나타내면 다음과 같이 MEMBER 에서 teamId 를 가지고 있는 방식, 즉 객체를 테이블에 맞추어 모델링하는 방식을 택할 수 있다. (참조 대신 외래 키를 그대로 사용함)
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME')
private String name;
@Column(name = "TEAM_ID")
private Long teamId; // 참조 대신 외래 키를 그대로 사용함.
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId());
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
→ 객체를 테이블에 맞춰 데이터 중심으로 모델링할 경우 협력 관계를 만들 수 없고 객체 지향적인 방법 또한 아니다.
→ 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾고, 객체는 참조를 사용해서 연관된 객체를 찾는다. 여기서 발생하는 간극을 해결해야한다!
즉, 테이블은 외래 키 하나로 MEMBER JOIN TEAM, TEAM JOIN MEMBER 가 가능하지만 객체는 참조가 있는 방향으로만 조회가 가능하고 이 패러다임 불일치를 해소하기 위해 연관관계 매핑이 필요하다.