지연로딩
![](https://velog.velcdn.com/images/shinjaewon99/post/9756abe6-41e7-43be-a318-de4fc32513c5/image.PNG)
- 단순히 A객체만 사용하는데 B객체까지 함께 조회하면 성능이 저하됨으로, 지연로딩을 사용한다.
- @ManyToOne 어노테이션에 fetch 타입을 LAZY 조건으로 설정한다.
- @ManyToOne(fetch = FetchType.LAZY)
- 실제 프록시로 가져온 그 객체를 사용하는 시점 (해당 객체의 메서드를 터치할때) 에 초기화가일어난다. (쿼리가 발생한다)
즉시로딩
- 대부분 비즈니스 로직에서 A객체와 B객체를 같이 사용할때 사용한다.
- @ManyToOne 어노테이션에 fetch 타입을 EAGER 조건으로 설정한다.
- @ManyToOne(fetch = FetchType.EAGER)
- 한방 쿼리로 다 조회해오고, 프록시 객체가 아니라 실제객체가 조회된다.
프록시와 즉시로딩 주의 (중요)
- 가급적 지연 로딩만 사용한다 (특히 실무에서는) 즉시로딩 사용 X !!
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 (추가쿼리가 발생하는) 문제를 일으킨다
- @ManyToOne, @OneToOne( X To One)은 기본이 즉시로딩 -> 클라이언트가 LAZY로 변경
- @OneToMany, @ManyToMany (X To Many)는 기본이 지연로딩이다.
- JPQL fetch 조인이나, Entity 그래프 기능을 사용하여 로직을 구성한다.