JPA 기본 5
연관 관계 매핑
용어 설명
- 방향(Direction) : 단방향, 양방향
- 다중성(Multiplicity) : 다대일, 일대다, 일대일, 다대다
- 연관관계 주인(Owner) : 객체 양방향 연관관계는 관리 주인 필요
테이블과 객체의 차이
- 테이블은 외래 키로 조인해서 연관 테이블 서칭
- 객체는 참조를 통해 연관 객체를 서칭
객체 지향 모델링
- 객체의 참조와 테이블의 외래 키를 매핑하여 해결한다.
@ManyToOne
,@OneToMany
등의 어노테이션을 통해 매핑 가능하다.
단방향 / 양방향 참조
- 단방향 참조는 두 객체 사이에 하나의 객체에서만 참조용 필드를 갖고 참조하는 관계를 말한다.
- 양방향 참조는 두 객체 모두가 각각 참조용 필드를 갖고 참조하는 관계를 말한다.
양방향 연관관계와 연관관계의 주인
mappedBy
- 객체와 테이블이 관계를 맺는 것의 차이를 알아야 이해하기 쉽다.
- 객체의 연관관계는 2가지.
- Member -> Team
- Team -> Member
- 테이블 연관관계는 1가지.
- FK 키 하나로 join 걸어서 찾으면 두 테이블 모두에서 같은 결과를 추출할 수 있다.
- 즉, Member <-> Team의 양방향 연관관계 하나를 가진다.
양방향 연관관계
- 객체의 양방향 연관관계는 사실 서로 다른 단방향 연관관계 2개의 합이다.
- 테이블의 양방향 연관관계는 외래 키 하나로 두 테이블의 연관관계를 관리한다.
연관관계의 주인
- 양방향에서 어떤 객체의 참조값을 변경해야하는지 결정이 필요하다.
- 이를 위해 객체의 두 관계 중 하나를 연관관계의 주인으로 지정한다.
- 연관관계의 주인만이 외래 키를 관리(등록, 수정)한다.
- 주인이 아닌 쪽은 읽기만 가능하다.
- 주인은 mappedBy 속성을 사용하지 않는다.
- 주인이 아니라면 mappedBy 속성으로 주인을 지정한다.
주인을 정하는 팁
- 외래 키가 있는 곳을 주인으로 정하자.
- 다대일이면 다 쪽이 연관관계의 주인이 되어야 효율적이다.
- 비즈니즈 로직을 기준으로 연관관계의 주인을 선택해서는 안된다.
양방향 연관관계 주의할 점
- 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정해야 한다.
- 연관관계 편의 메서드를 생성한다.
- 변경 시 객체 하나가 아니라 다른 객체도 같이 변경되도록 편의를 주는 메서드를 정의하여 사용한다.
- 두 객체 중 하나에서만 정의해 사용하는 것이 무한루프 방지 등 효율적인 모습을 보인다.
- 양방향 매핑 시 무한 루프를 조심해야 한다.
- toString(), lombok, JSON 생성 라이브러리 등
양방향 매핑 정리
- 단방향 매핑만으로 이미 설계를 완료했어야 한다. 즉, 양방향을 사용하지 않는 설계를 먼저 해야한다.
- 양방향 매핑은 그저 반대 방향으로 조회하는 기능만이 추가된 것이다.
- 객체 입장에서는 양방향 매핑을 사용할 때 이점이 없다.
- 실무에서는 JPQL에서 역방향으로 탐색할 일이 생각보다 많다.
- 단방향 매핑을 잘 하고 양방향 매핑은 필요 시 추가해서 사용하자. (테이블에 영향 미치지 않음)
Comments powered by Disqus.