본문 바로가기

카테고리 없음

[자바 ORM 표준 JPA 프로그래밍] 5. 연관관계 매핑 기초

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 - 주의점, 정리