[ JPA ] 프록시와 지연 로딩

유기훈·2022년 9월 30일
0

JPA

목록 보기
11/13
post-thumbnail

Member Entity가 Team과 1:N 관계일 때 Member Entity에는 Team 멤버변수가 들어가게 된다. 이 때 Member를 조회하게 되면 Team도 함께 조회해야 할까?

-> Member를 조회할 때 Team도 무조건 같이 사용하게 되는 경우가 많다면 같이 조회해서 사용할 수 있다.
-> 하지만 그럴 일은 많지 않다. 그래서 우리는 Member를 조회할 때 Team 테이블을 조회하지 않고 미루기로 했다. 이 때 가짜 엔티티를 Team에 할당하는데 이 것을 프록시라고 한다.

프록시의 특징

  • 프록시 객체는 처음 사용할 때 한 번만 초기화한다.
  • 프록시 객체는 원본 엔티티를 상속받는다. 따라서 타입 체크시 instance of를 사용해야한다.
  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다.

지연 로딩

앞에서 Member를 조회할 때 Team 테이블을 조회하지 않고 미룬다고 했다. 그렇다면 미룰려면 어떻게 해야 할까? -> fetch 타입을 LAZY로 해주면 된다.

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "TEAM_ID")
	privtate Team team;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "LOCKER_ID")
    private Locker locker;

이 처럼 @XXXToOne 끝이 One으로 끝나는 애노테이션은 FetchType.EAGER가 기본 타입이다. EAGER는 즉시 로딩이다. 그래서 이러한 애노테이션들은 FetchType.LAZY를 붙여주어야 한다.

※※※ 실무에서는 무적권 지연 로딩을 사용하라

profile
개발할 수 있어 감사하다

0개의 댓글