목차
N + 1 문제
하나의 쿼리(1) 를 날린 후 조회된 결과 값과 연관된 데이터 를 가져오기 위해 결과의 행수(N) 만큼 추가 쿼리가 발생하는 문제
즉시로딩
FetchType.EAGER
로 설정하게 되면 즉시 조회하게 된다.
- Join 해서 한방 쿼리로 가져오는 방법
- 데이터를 가져온 후 후속 쿼리를 날리는 기법, 해당 방법은 N + 1 문제를 일으킨다.
@ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team;
|
프록시와 즉시로딩 주의
- 즉시 로딩을 적용하면 예상하지 못한 SQL 이 발생
- 즉시 로딩은 JPQL 에서 N + 1 문제를 일으킨다.
- JPA 가 만들어주는 쿼리는 내부적으로 최적화가 이뤄진다.
- JPQL 은 내부적으로 SQL 로 번역된 후 데이터를 가져온 다음에 연관 데이터에 대해 후속적으로 쿼리가 발생한다.
- 해결법 1 : fetch join
- 해결법 2 : @EntityGraph
- 해결법 3 : batch size
@ManyToOne
, @OneToOne
은 기본이 즉시 로딩
@OneToMany
, @ManyToMany
는 기본이 지연 로딩
지연로딩
FetchType.LAZY
로 설정하게 되면 Proxy 로 조회하게 된다.
- 실제 해당 객체를 사용하는 시점에 초기화를 진행한다.
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team;
|