6. 프록시와 지연로딩

신명철·2022년 2월 12일
0

JPA

목록 보기
6/14

프록시

A 테이블에 수백개의 테이블이 연관되어 있다고 가정해보자. 만약 A 테이블을 조회한다면 A 와 연관된 테이블들을 모두 가져올 것이고, A 와 연관된 테이블들과 연관된 테이블들도 가져오려고 할 것이다.

우리는 우리에게 필요한 A 만 찝어서 가져오는 로직이 필요하다!

JPA 는 프록시(가짜 객체)라는 개념을 써서 A 와 연관된 테이블들의 조회를 실제로 사용할 때 까지 미루는 방법을 사용한다.

프록시의 특징

  • 프록시 객체는 진짜 객체와 겉모양이 똑같다
    • 원본 엔티티를 상속받기 때문이다.

  • 실제 객체를 사용하는 시점에서야 이를 가져온다.
    • 영속성 컨텍스트가 DB 를 조회해서 접근 내용을 반영한 실제 객체를 생성하게 된다.
    • 다만 실제 객체가 영속성 컨텍스트에 이미 있으면 실제 객체와 연결시킨다.
  • 프록시 객체가 실제 엔티티로 바뀌는 것이 아니라 참고 값으로 실제 엔티티를 연결시켜 주는 것이다.

즉시 로딩과 지연 로딩

프록시를 이용해 위와 같은 문제를 해결할 수 있는 방법으로 지연로딩 이 있다.

  • 지연로딩 : 조회 시 프록시 엔티티를 가져옴
    • @ManyToOne(fetch=fetchType.LAZY)
  • 즉시로딩 : 조회 시 진짜 엔티티를 가져옴
    • @ManyToOne(fetch=fetchType.EAGER)

@ManyToOne, @OneToOne 은 기본 값이 즉시 로딩이기 때문에 지연로딩으로 바꿔줘야 한다.

CASCADE

DB 의 CASCADE 설정을 할 수 있다.
자식 엔티티에 아래와 같은 속성을 추가시켜 주면 된다.
예를 들어 저장이나 삭제 시 연관된 엔티티를 대상으로 자동으로 같은 작업을 하게 된다.

  • 연관관계의 주인은 상관없다. 모든 연관관계 테이블에 사용 가능

@OneToMany(mappedBy="parent", cascade=CascadeType.XXXX)

  • ALL : 모두 적용
  • PERSIST : 영속
  • REMOVE : 삭제
    • 저장할때만
  • MERGE : 병합
  • REFRESH, DETACH

고아 객체

자식 엔티티가 부모 엔티티와 연관관계가 끊어지면 자식 엔티티를 자동으로 삭제한다.

  • 참조하는 곳이 하나일 때 사용
  • 특정 엔티티가 개인 소유할 때 사용
  • CascadeType.REMOVE 처럼 동작한다

@OneToMany(orphanRemoval = true)

고아 객체와 CASCADE를 같이 사용(CasCadeType.ALL + orphanRemoval = true)하면 부모 엔티티로 자식 엔티티의 생명주기를 관리할 수 있다.


출처

profile
내 머릿속 지우개

0개의 댓글