-
지연로딩과 즉시로딩JPA 2023. 1. 4. 19:21
단순히 Member만 사용하는 비즈니스 로직이라고 한자.
Member를 조회할때 Team까지 모두 가져오면 손해이다.
따라서 이때 지연로딩이라는 옵션을 제공한다.
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false) private Team team;
team을 프록시객체를 주게된다. 즉, Member클래스만 DB에서 조회한다.
프록시 객체로 가지고 있다가, 이후 team의 이름을 가져오거나 등등 team을 사용하는 순간에 프록시객체가 초기화된다.
Team을 가져올때가 아니다. 주의하자!
만일 비즈니스상에서 Member와 Team을 함께 사용해야 하는 부분이 많다면 Lazy는 성능이 좋지 않다.
이를 다음과 같이 즉시로딩으로 변경시켜야 한다.
@ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team;
초기화 필요 없이 이때는 진짜 객체도 같이 조회된다.
이때 JOIN쿼리를 날려서 한번에 값을 가져온다.
하지만,,,
- 가급적 지연 로딩만 사용
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생. 한두개 join을 한다고 해서 성능저하가 발생하지는 않지만,,,수십개, 수백개면?? -> 미쳐버린다.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩
-> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
728x90'JPA' 카테고리의 다른 글
[JPA] soft delete 자동으로 처리하기 (0) 2023.03.26 CASECADE (0) 2023.01.04 프록시 (0) 2023.01.04 상속관계 (0) 2023.01.04 다양한 연관관계 매핑2 (0) 2023.01.03