학습 목표
- 객체와 테이블 연관관계 간의 차이를 이해
- 객체의 참조와 테이블의 외래키를 매핑
- 용어 이해
- 방향: 단방향, 양방향
- 다중성: 다대일, 일대다, 일대일, 다대다
- 연관관계 주인: 양방향 연관관계는 관리하는 주인이 필요
연관관계의 필요성
객체를 테이블에 맞추어 모델링
객체를 테이블에 맞춰서 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.
테이블과 객체 사이에는 큰 차이가 있기 때문이다.
테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다면, 객체는 참조를 사용해서 연관된 객체를 찾는다.
객체 간에 양방향 연관관계를 만들고 싶으면, 두 객체에 필드를 추가해서 참조를 보관해야 한다.
참조를 통한 연관관계는 항상 단방향이기 때문이다.
이와 달리 테이블은 외래키 하나로 양방향 조인이 가능하다.

Member, Team 엔티티를 아래 코드를 통해 생성할 수 있다.

이제 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가 속한 team 객체 조회
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가 속한 Team 객체 조회
Member findMember = em.find(Member.class, member.getId());
Team findTeam findMember.getTeam();
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com