⚙️ 기본 개념
객체의 연관관계를 공부하기 전에 객체와 테이블 연관관계의 차이를 이해해야 한다.
테이블에서는 테이블 간의 연관관계를 외래 키(Foreign Key)를 사용해 간단하게 매핑한다.
그럼 객체에서는?
참조관계를 활용해서 객체 간의 연관관계를 가지는데 여러가지의 매핑방법이 있다.
// 멤버 객체 생성
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}
// 팀 객체 생성
@Entity
public class Team {
private Long id;
private String name;
}
@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객체에 TeamId를 저장할 때 team객체에서 Id를 얻어와서 저장함(외래키 식별자를 직접 다룸)
// -> 객체지향적이지 않음
member.setTeamId(team.getId());
em.persist(member);
//회원 조회
Member findMember = em.find(Member.class, member.getId());
//팀 조회
Team findTeam = em.find(Team.class, team.getId());
// -> 두 객체 사이에 전혀 연관관계가 없음
//회원 조회
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
// -> 회원의 팀을 조회하기 위해서는 위와 같은 코드인데 객체지향적이지 않음
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
// 어노테이션을 사용해 연관관계를 매핑해준다.
// TeamId가 아닌 Team 객체 자체를 멤버 변수로 갖는다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//참조관계를 사용해서 바로 연관관계 조회가능
Team findTeam = findMember.getTeam();
- 어노테이션을 사용해 객체 간에 연관관계를 갖도록 매핑
- 참조관계에 있는 객체를 멤버 변수로 사용