'연관관계 매핑' 섹션에서는 JPA를 공부하면서 다대일(ManyToOne), 일대다(OneToMany) 이런 단어들을 계속 듣게 될 텐데, 이 부분의 기초적인 내용과 JPA에서 연관관계란 어떤 건지 배울 수 있었다.
연관관계가 필요한 이유
먼저 학습을 위해 필요한 용어에는 3가지가 있다.
- 방향(Direction): 단방향, 양방향
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
- 연관관계의 주인(Owner): 객체 양방향 연관관계를 관리하는 주인이 필요
여기서 다중성도 중요하지만 연관관계의 주인이 꽤나 중요한 개념이다.
나도 포스팅하면서 다시 복기해야겠다..
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다.
먼저 객체를 테이블에 맞추어 모델링을 하면 아래와 같다.
회원과 팀은 TEAM_ID라는 외래키로 연결되어 있다.
이 구조로 객체를 만들어보면 아래와 같다.
@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;
}
이 구조로 member1의 소속 팀을 조회한다면 아래와 같다.
1. 팀을 저장한다.
2. 회원을 저장한다. 이때 둘의 연결고리인 teamId를 member에 set 해서 회원을 저장한다.
3. em.find로 member를 조회한다.
4. 구조상 team을 바로 꺼낼 수 없기에 이 member의 teamId를 꺼내서 team을 조회한다.
//팀 저장
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);
객체는 참조를 사용해서 연관된 객체를 찾는다.
외래 키를 사용하는 거랑 참조랑은 다르다.
이렇게 객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.
[참고] 인프런 - 김영한 님의 자바 ORM 표준 JPA 프로그래밍-기본편 강좌를 보고 공부한 내용을 바탕으로 작성했습니다.