[연관관계 매핑 기초] 연관관계 필요성, 단방향 연관관계
목표
- 객체와 테이블 연관관계의 차이를 이해
- 객체의 참조와 테이블의 외래키를 매핑
- 용어 이해
- 방향: 단방향, 양방향
- 다중성: 다대일, 일대다, 일대일, 다대다
- 연관관계 주인: 양방향 연관관계는 관리하는 주인이 필요
연관관계의 필요성
객체를 테이블에 맞추어 모델링
객체를 테이블에 맞춰서 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.
테이블과 객체 사이에는 큰 차이가 있기 때문이다.
테이블은 외래키로 조인하여 연관된 테이블을 찾는다면,
객체는 참조를 사용해서 연관된 객체를 찾는다.
객체 간에 양방향 연관관계를 만들고 싶으면, 두 객체에 필드를 추가해서 참조를 보관해야 한다.
참조를 통한 연관관계는 항상 단방향이기 때문이다.
이와 달리 테이블은 외래키 하나로 양방향 조인이 가능하다.
member 객체가 속한 team 객체를 조회해 보자.
연관관계가 없기 때문에 team을 가져오는 코드가 객체 지향적이지 않다.
// 팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// 회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); //member를 team에 소속 시킴
em.persist(member);
Member findMember = em.find(Member.class, member.getId())
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId)
이러한 문제점을 연관관계 설정으로 해결할 수 있다.
단방향 연관관계
객체 지향 모델링
객체 연관관계를 사용하였다.
테이블 연관관계
회원 테이블과 팀 테이블은 양방향 관계이다.
회원 테이블의 외래키 TEAM_ID로 양방향 조인이 가능하다.
객체 연관관계
Member 객체는 Member.team 필드로 Team 객체와 연관관계를 맺는다.
회원과 팀 객체는 단방향 관계이다.
Member 객체는 team 필드로 Team을 조회할 수 있지만, Team 객체로는 Team 소속 member들을 알 수 없다.
JPA에게 TEAM과 MEMBER의 관계를 알려줘야 한다.
한 팀에 여러 회원이 속할 수 있으므로 1:N 관계이다.
따라서 N 쪽인 Member에 연관관계 매핑을 해주었다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team
Member와 Member에 속한 Team을 조회해 보자.
이전 코드와 달리 Member에 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();
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
[JPA] 연관관계 매핑 기초 #1 (연관관계의 필요성, 단방향 연관관계)
이번 글에서는 **에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (강추) 1. 연관관계가 필요한 이유 > > - 회원과 팀이 있다. > - 회원은 하나의 팀
velog.io