연관 관계 매핑 기초 - 단방향 연관 관계
13592 단어 Java ORM 표준 JPAJava ORM 표준 JPA
연관 관계가 필요한 이유
객체를 테이블에 맞추어 모델링
- 예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계이다.
- 객체를 테이블에 맞추어 모델링하며 연관관계가 없는 경우
위 그림과 같이 MEMBER 테이블은 TEAM 테이블의 TEAM_ID를 FK로 가져와 연관관계가 존재하지만 객체에서는 서로 연관 관계가 존재하지 않는다. - Entity 구현
Member 객체는 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;
…
}
- 객체 지향적이지 않다.
Member 객체에 Team의 id를 설정하기 위해서는 Team 객체에서 id 값을 얻어와 직접 주입해주어야 한다.
//팀저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
//team의 id를 가져와 직접 주입
member.setTeamId(team.getId());
em.persist(member);
//팀저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
//team의 id를 가져와 직접 주입
member.setTeamId(team.getId());
em.persist(member);
Member와 Team을 조회하는 경우에도 Member와 Team을 각각 식별자로 조회해야한다.
//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
Team findTeam = em.find(Team.class, team.getId());
- 객체를 테이블에 맞추어 데이터 중심으로 모델링하는 경우 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인하여 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다
- 이렇듯 객체와 테이블 사이에는 큰 차이점이 있다.
단방향 연관 관계
객체 지향 모델링
- 객체의 연관 관계를 사용해서 모델링 하는 경우
Member 객체는 Team의 id가 아닌 Team 그 자체를 참조를 통해 연관 관계가 형성되어 있다.
코드로 보면 아래와 같이 @ManyToOne을 통해 다대일 관계를 형성한다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- 객체 지향적이다.
Member에 Team을 설정해줄 때도 바로 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 객체에서 바로 Team을 조회 가능하다.
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
[Reference]
Inflearn 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
Author And Source
이 문제에 관하여(연관 관계 매핑 기초 - 단방향 연관 관계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minmin_key/연관-관계-매핑-기초저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)