스프링 부트/JPA
[JPA 프로그래밍 기본기 다지기] 양방향 매핑 노트
newwisdom
2021. 8. 14. 15:36
반응형
2021-05-29글
양방향 매핑
- 반대방향으로도 그래프 조회가 가능해야함
연관 관계의 주인과
- 왜 mappedBy를 해주는 건지?
- 객체는 서로를 포함하고 있어야 함 (2개가 필요)
객체와 테이블이 관계를 맺는 차이
객체 연관관계
- 회원 -> 팀 연관 관계 1개 (단방향)
- 팀 -> 회원 연관관계 1개 (단방향)
테이블 연관관계
- 회원 <-> 팀의 연관관계 1개 (양방향)
이 차이를 어떻게 극복할거냐??
객체의 양방향 관계
객체는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다.
객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 함
테이블의 양방향 관계
테이블은 외래키 하나로 두테이블의 연관 관계를 관리
둘 중 하나로 외래키를 관리해야 한다
- 객체는 두 곳에서 연관관계에 있는 객체를 다루고 있음
- 그러면 뭘 믿어야 하나?
- 두개는 어차피 다르다. 둘 중 하나만 주인으로 만들자
연관 관계의 주인
- 두곳에 있는 객체중 하나만 주인으로 두고 걔만 영향을 받음
양방향 매핑 규칙
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래키를 관리(등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용 x
- 주인이 아니면 mappedBy 속성으로 주인 지정
그런데 누구를 주인으로 해야하나?
- 외래키가 있는 곳을 주인으로 정해라
- 여기서는 Member.team이 연관관계의 주인
참고 - 설계
- 일단 단방향으로 다 설계를 하고 양방향이 필요할 때 양방향을 추가하자
- 양방향은 조회를 편하게 하기 위해 사용하는 느낌
- 인지 부조화가 생기지 않음
양방향 매핑시 가장 많이 하는 실수
- 연관관계의 주인에 값을 입력하지 않음
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("amazzi");
member.setTeam(team);
em.persist(member);
- 주인에 값을 입력하기
양방향 매핑시 연관관계의 주인에 값을 입력해야함
- 순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 함
- 실제 코드에는 양쪽 다 할 것을 권장
양방향 매핑의 장점
- 단방향 매핑만으로도 이미 연관관계 매핑은 완료
- 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐
- JPQL에서 역방향으로 탐색할 일이 많음
- 단방향 매핑을 잘하고 양방향은 필요할 때 추가해도 됨(테이블에 영향을 주지 않음)
연관 관계 매핑 어노테이션
- 다대일
@ManyToOne
- 일대다
@OneToMany
- 일대일
@OneToOne
- 다대다
@ManyToMany
@JoinColum
,@JoinTable
상속 관계 매핑 어노테이션
@Ingeritance
@DiscriminatorColumn
@DiscriminatorValue
@MappedSuperclass
: 매핑 속성만 상속
복합키 어노테이션
@IdClass
@EmbeddeId
@Embeddable
@MapsId
참고 자료
반응형