-
즉시 로딩
- 엔티티를 조회할 때 해당 엔티티와 매핑된 엔티티도 한번에 조회하는 것
- @OneToOne
, @ManyToOne
으로 매핑하는 경우 기본 Fetch 전략이 즉시로딩이다.
-
일대일 단방향 매핑
- 회원 - 장바구니
-
다대일 단방향 매핑
- 장바구니 - 장바구니 상품 - 상품
- 주문* - 회원1
-
다대일/일대다 양방향 매핑
- 주문1 - 주문 상품*
양방향 매핑
- 단방향 매핑이 2개 있는 것
- 연관 관계 주인을 설정해줘야 함
엔티티를 양방향 연관 관계로 설정하면?
- 객체의 참조는 둘인데 외래키는 하나이므로, 둘 중 누가 외래키를 관리할지를 정해야 한다.
- 연관관계의 주인은 외래키가 있는 곳으로 설정
- 연관관계의 주인은 외래키를 관리(등록, 수정 삭제)
- 주인이 아닌 쪽은 연관관계 매핑 시 mappedBy 속성의 값으로 연관관계의 주인을 설정
- 주인이 아닌 쪽은 읽기만 가능
단방향 연관관계 매핑으로 설계 후 나중에 필요한 경우 양방향 매핑을 추가하는 게 좋다.
- 왜냐하면 양방향으로 연관관계를 매핑하면 해딩 엔티티는 엄청나게 많은 테이블과 연관관계를 맺게 되고 엔티티 클래스 자체가 복잡해지기 때문
다대다 매핑?
- 다대다 매핑은 실무에서는 사용하지 않음. 관계형 데이터베이스는 정규화된 테이블 2개로 다대다를 표현할 수 없다.
- 따라서 연결 테이블을 생성해서 다대다 관계를 일대다, 다대일 관계로 풀어낸다.
영속성 전이
- 엔티티의 상태를 변경할 때 해당 엔티티와 연관된 엔티티의 상태 변화를 전파시키는 옵션
- 영속성 전이 옵션은 단일 엔티티에 완전히 종속적이고 부모 엔티티와 자식 엔티티의 라이프 사이클이 유사할 때 cascade 옵션을 활용해보자
고아 객체 제거
고아객체는 부모 엔티티와의 연관관계가 끊어진 자식엔티티를 말한다.
- 고아 객체 제거 기능은 참조하는 곳이 하나일 떄만 사용해야 한다. 다른 곳에서도 참조하고 있는 엔티티인데 삭제하면 문제가 생길 수 있다.
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade = CascadeType)
private List<OrderItem> orderItems = new ArrayList<>();
}
지연 로딩
@OneToMany
어노테이션의 경우 기본 FetchType이 LAZY 방식이다.
- 지연로딩으로 설정하면 실제 엔티티 대신 프록시 객체를 넣어둔다.
- 프록시 객체는 실제로 사용되기 전까지 데이터 로딩을 하지 않고, 실제 사용 시점에 조회 쿼리문이 실행된다.
- 지연로딩을 통해 쿼리문이 필요할 때만 실행해도록 최적화를 할 수 있다. 그런데 성능 저하는 데이터를 저장하거나 수정할 때 일어나기보다는, 데이터롤 조회할 때 일어난다.