즉시 로딩과 지연 로딩

4618 단어 JPASpringJPA

Member만 조회하고 싶을때,

Team을 가져와야 하나?

지연 로딩 LAZY을 사용해서 프록시로 조회

@Entitypublic class Member {



	
@Id@GeneratedValueprivate Long id;@Column(name = "USERNAME")private String name;
 


	@ManyToOne(fetch = FetchType.LAZY) //** 
	@JoinColumn(name = "TEAM_ID")private Team team;..
}

지연로딩 (LAZY)를 하게 되면, Team을 프록시로 가져온다.

Member와 Team을 계속 같이 쓴다면?

@Entitypublic class Member {



	
@Id@GeneratedValueprivate Long id;@Column(name = "USERNAME")private String name;
 


	@ManyToOne(fetch = FetchType.EAGER) //** 
	@JoinColumn(name = "TEAM_ID")private Team team;..
}

프록시를 사용하지 않고 즉시 다 가져옴

즉시로딩(EAGER) 사용시, Member 조회할때 항상 Team도 조회

프록시와 즉시로딩 주의

  • 실무에서는 지연 로딩(LAZY)만 사용
  • 즉시 로딩을 사용하면 전혀 예상하지 못한 SQL이 발생
  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
    N+1이란, 쉽게 말해 Member를 조회하면 Team을 무조건 가져오므로,
    무조건 1개의 쿼리가 나갈때 Team을 조회하는 쿼리가 하나 더 나간다.
    100개의 데이터를 조회하면 100 + 100개를 조회해야하므로, 양이 많아질수록 문제가 발생할 수 있음
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩
 -> LAZY로 설정

JPQL에서도 join fetch 등을 이용해 EAGER을 사용할 수 있음.
(LAZY가 걸려있어도 값을 가져옴)

좋은 웹페이지 즐겨찾기