JPA 매핑 정리 그리고 영속성 전이, 지연로딩

wisdom·2022년 8월 18일
0

백엔드 개발자라면?

목록 보기
16/42
  • 즉시 로딩
    - 엔티티를 조회할 때 해당 엔티티와 매핑된 엔티티도 한번에 조회하는 것
    - @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 방식이다.
  • 지연로딩으로 설정하면 실제 엔티티 대신 프록시 객체를 넣어둔다.
    - 프록시 객체는 실제로 사용되기 전까지 데이터 로딩을 하지 않고, 실제 사용 시점에 조회 쿼리문이 실행된다.
  • 지연로딩을 통해 쿼리문이 필요할 때만 실행해도록 최적화를 할 수 있다. 그런데 성능 저하는 데이터를 저장하거나 수정할 때 일어나기보다는, 데이터롤 조회할 때 일어난다.
profile
문제를 정의하고, 문제를 해결하는

0개의 댓글