이번 스터디 목표


연관관계 매핑 필요성

객체는 참조(주소)를 사용해서 관계를 맞고 테이블은 외래 키를 사용해서 관계를 맺는다. 이 둘은 완전 다른 특징을 갖게되고 이로 인해 객체와 테이블을 매핑해야한다. 객체 관계 매핑에서 가장 어려운 부분이 객체 연관관계와 테이블 연관관계를 매핑하는 일이다.

다음과 같은 테이블이 있다고 해보자. MEMBER (N) : TEAM (1) 일 때, 테이블 연관관계는 다음과 같이 나타낼 수 있다. 이를 연관관계가 없는 객체로 나타내려면 어떻게 할 수 있을까?

Untitled

연관관계가 없는 객체로 나타내면 다음과 같이 MEMBER 에서 teamId 를 가지고 있는 방식, 즉 객체를 테이블에 맞추어 모델링하는 방식을 택할 수 있다. (참조 대신 외래 키를 그대로 사용함)

Untitled

@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 가 가능하지만 객체는 참조가 있는 방향으로만 조회가 가능하고 이 패러다임 불일치를 해소하기 위해 연관관계 매핑이 필요하다.