카테고리 없음
[자바 ORM 표준 JPA 프로그래밍] 5. 연관관계 매핑 기초
Dahee Joy Cha
2024. 5. 6. 19:17
keyword
- 방향(Direction): 단방향, 양방향
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
- 연관관계의 주인(Owner): 객체의 양방향 관계에서 주인 설정이 필요
엔티티끼리 연관관계가 없을 경우 무엇이 문제일까?
예) Team과 Member는 다대일 관계일 경우를 살펴보자.
// 연관관게가 없을 경우
// member와 team을 저장시 : member에 team을 연결하는 대신, teamId를 세팅하여 객체 지향스럽지 않다.
Team team = new Team();
team.setTeamName("TeamA");
em.persist(team);
Member member = new Member();
memeber.setUserName("member1");
memeber.setTeamId(team.getId());
em.persist(member);
// member와 team을 조회시, member를 한번 검색하는것으로 그치지 않고, id와 team을 각각 조회해야한다.
Member findMember = em.find(Member.class, member.getId()); // member를 찾고
Long findTeamId = findMember.getTeamId(); // teamId를 조회해서
Team findTeam = em.find(Team.class, findTeamId); // team을 조회해야한다.
객체를 테이블 중심으로 설계하면 안된다.
테이블은 외래키로 조인을 해서 연관 테이블을 찾는 반면,
객체는 참조를 사용해서 연관 객체를 찾는다.
엔티티끼리 연관관계를 맺어보자.
단방향 연관관계
단방향 연관관계
// 연관관게가 없을 경우
// member와 team을 저장시 : member에 team을 연결하는 대신, teamId를 세팅하여 객체 지향스럽지 않다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
memeber.setUserName("member1");
memeber.setTeam(team);
em.persist(member);
// member와 team을 조회시, member를 한번 검색하는것으로 그치지 않고, id와 team을 각각 조회해야한다.
Member findMember = em.find(Member.class, member.getId()); // member를 찾고
Team findTeam = findMember.getTeam; // team을 바로 조회할 수 있다.
연관관계 수정 방법
Team newTeam = em.find(Team.class, 100L);
findMember.setTeam(newTeam);
양방향 연관관계와 연관관계의 주인: (1) 기본
양방향 연관관계, 언제 필요할까?
- 테이블의 연관관계는 외래키 하나로 JOIN을 하므로, team에서 member를, member에서 team을 알 수 있다.
- 두 엔티티간 서로 알기 위해서는 양방향 매핑이 필수다.
- ManyToOne의 fetch 기본 타입은 EAGER다. 웬만하면 LAZY로 두고 쓰자.
연관관계 주인과 mappedBy (왕중요!)
둘 중 하나로 외래키를 관리해야 한다.
"연관관계를 업데이트 하기 위해, member에 있는 team을 바꾸어야할까? 아니면 Team의 members를 바꾸어야할까?"
이 때 사용하는 개념이 연관관계의 주인(Owner)이다.
양방향 매핑 규칙
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래키를 관리한다. (등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능하다
- 주인은 mappedBy 속성을 사용하지 않는다.
- 주인이 아니면 mappedBy 속성으로 주인을 지정한다.
누구를 주인으로 정할 것인가?
- 외래키가 있는 곳을 주인으로 정하라
- ManyToOne의 관계에서 Many쪽이 주인이다.
- 위 예제에서는 Member.team이 연관관계의 주인이다.
양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리