JPA 즉시 로딩과 지연 로딩

정체는 김태현·2022년 10월 31일
0

항해99

목록 보기
35/38

지연로딩

Lazy를 사용해서 프록시로 조회 - 연관관계가 있는 경우 FetchType을 LAZY로 설정해야 해당 객체가 프록시로 설정된다.

다음처럼 fetchType을 LAZY로 등록하면 Member에서 Team 객체가 프록시로 설정된다.

Team 안에 필드에 직접적으로 접근(필드를 터치하기 전)하기 전까지는 Team 테이블에 접근되지 않는다.

@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "USERNAME")
    private String name;

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

즉시로딩

fetchType을 EAGER로 등록하면 즉시로딩으로 설정된다.

동시적인 조회가 많이 일어나는 경우 fetchType을 EAGER로 설정하여 한꺼번에 조회할 수 있도록 한다.

주의사항

가급적이면 지연로딩만 사용(특히 실무에서)​

즉시 로딩을 적용하면 예상치 못한 SQL이 발생(테이블이 많으면 조인이 수십개 걸려서 성능저하)

즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.(의도치 않은 쿼리가 하나씩 더 나감. N개의 결과+ 결과당 추가적인 쿼리 1번)

-> 지연 로딩으로 해두고, 한방 쿼리가 필요할때는 JPQL 작성시 FETCH JOIN으로 작성한다.

List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();

// SQL : SELECT * FROM Member -> 엔티티에 TEAM 있는 것 확인
// SQL2 : SELECT * FROM Team where TEAM_ID = XXX -> 뒤이어 TEAM에 대한 쿼리가 한번 더 나감.

@ManyToOne, @OneToOne은 기본이 즉시로딩 -> fetchType을 모두 LAZY로 설정

@OneToMany, @ManyToMany는 기본이 지연로딩




출처
https://blog.naver.com/zzang9083/222826236717

profile
하나부터 열가지 다

0개의 댓글