[김영한님의 자바 ORM 표준 JPA 프로그래밍을 학습 후 정리한 내용입니다.]
순서
- 연관 관계가 필요한 이유
- 단방향 연관 관계
- 양방향 연관 관계와 연관 관계의 주인
- 양방향 매핑 시 많이 하는 실수 ★★
1. 연관 관계가 필요한 이유
“객체 지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.”
by 객체지향의 사실과 오해
[객체를 테이블에 맞추어 모델링]
객체를 테이블에 맞추어 데이터를 중심으로 모델링을 하게 되면, 위 사진과 같이 member에서 team을 set하는 과정에서 team의 id값만을 가지게 되므로, team 자체에 대한 관계를 매핑할 수 없게 된다. 따라서 이 방법으로는 객체 간의 협력 관계를 만들 수 없다.
2. 단방향 연관 관계
따라서 위의 예제에서 team.getId()를 set하는 것이 아닌, team 객체 자체를 set할 필요가 있다.
[Member]
엔티티에는 단방향으로 @ManyToOne의 Team필드를 선언한다.
3. 양방향 연관 관계와 연관 관계의 주인
단방향과 달리 양방향에서는 연관되는 테이블 쪽에서도 @OneToMany 와 같이 매핑을 해주어야 한다. 동시에 mappedBy로 어떤 테이블에 매핑이 되어 있는지를 명시해줘야 한다.
[Member]
[Team]
※mappedBy를 왜 사용할까? - 본래 테이블 간의 관계에서는 FK를 한 테이블에서 관리한다. 하지만 우리가 만든 연관 객체는 양방향으로 만들었으므로, 어느 테이블에서 FK를 관리할 것인지 정해야 한다. 따라서 mappedBy를 사용해서 누가 연관관계의 주인인지, 즉, FK를 누가 관리할 것인지를 정한다.
양방향 매핑 규칙은 다음과 같다.
- 객체의 두 관계 중 하나를 연관 관계의 주인으로 지정
- 연관 관계의 주인만이 외래 키를 관리(등록, 수정)
- 주인이 아닌 쪽은 readOnly
- 주인은 mappedBy 속성 사용 X
4. 양방향 매핑 시 많이 하는 실수 ★★
[틀린 예 - 연관 관계의 주인에 값을 입력하지 않는 경우]
[올바른 예 - 연관 관계의 주인에 값을 입력한 경우]
순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하는 습관을 들이는 것이 좋다. 이를 위해 아래와 같이 연관관계 편의 메소드를 엔티티에 생성하는 것도 좋은 방법이다.
public void addOrderItem(OrderItem orderItem){
orderItemList.add(orderItem);
orderItem.setOrder(this);
}
또한, 양방향 매핑 시에 무한 루프를 조심해야 한다. (toString(), lombok, JSON생성 라이브러리) → Controller계층에서 클라이언트에 응답할 때 엔티티가 아닌 Dto로 보내자!
정리
우선은 단방향 매핑만으로 데이터베이스를 설계할 수 있어야 한다. 양방향 매핑은 반대 방향으로 조회 할 수 있는 기능이 추가된 것 뿐이다. (JPQL에서 역방향으로 탐색할 일이 많다)
따라서 양방향 매핑은 테이블에 영향을 주지 않기 때문에 단방향 매핑을 잘 한 후에, 필요할 때 추가하는 식으로 하자.
'ORM > JPA' 카테고리의 다른 글
[JPA] 프록시와 연관관계 관리 (1) | 2023.04.24 |
---|---|
[JPA] 다양한 연관관계 매핑 (1) | 2023.04.24 |
[JPA] 엔티티 매핑 (0) | 2023.04.24 |
[JPA] OSIV 성능 최적화 정리 (0) | 2023.04.18 |
[JPA] 컬렉션 조회 최적화 (0) | 2023.04.17 |
댓글