본문 바로가기
Web/Spring

[Spring-boot JPA] 즉시로딩(EAGER)과 지연로딩(LAZY)

by EricJeong 2019. 9. 6.

즉시로딩(FetchType - EAGER)은 엔티티를 조회할 때 연관된엔티티를 함께 조회합니다.

상품 Item과 카테고리 Category 엔티티가 N:1관계일 때 상품 테이블에Category 엔티티를 추가할 수 있습니다.

 

 

이 때 fetch type을 정할 수 있는데, 이 타입을 LAZY로 설정하면 지연로딩, EAGER로 설정하면 즉각 로딩으로 설정할 수 있습니다.

 

 

 

 

즉시로딩은 Item 엔티티를 조회할 때 연관된 Category 엔티티를 즉시 조인해서 값을 넣어주게 됩니다.

 

 

 

지연로딩은 Item 엔티티를 조회할 때 연관된 Category 엔티티를 조인하지 않습니다. 즉 값을 넣어주지 않습니다.

대신 이 Category엔티티를 참조할 때 조인 쿼리를 작성하여 값을 넣어줍니다. 필요할 때 넣어준다는 뜻입니다.

 

N:1관계에서 1에 해당하는 객체를 기본적으로 즉시 로딩을 통해 가져오게 됩니다.

권장되는 사항은 모든 로딩을 지연 로딩으로가져오는 것입니다.

즉시 로딩은 예상하지 못한 SQL이 발생하고, 굉장히 많은 문제를 발생시킬 가능성이 생깁니다.

 

예를 들어 조인 가능한 테이블이 10개 정도 있다고 하면, 테이블 하나를 조회할 때 즉시 10개의 테이블이 같이 조회되는 경우가 생기고 심각한 성능 문제를 야기할 수 있게 됩니다.

 

@ManyToOne, @OneToOne은 Default 값으로 즉시 로딩이 설정되어있습니다.

그러므로 fetch 속성을 FetchType.Lazy로 설정하여 지연 로딩으로 설정하는것을 권장합니다.

 

 

@ManyToOne, @OneToOne은 Default 값으로 지연로딩으로 설정되어있습니다.

지연 로딩을 설정하게 되면 해당 객체를 조회할 때 그 객체를 조회하는 쿼리가 발생하게 됩니다.

 

 

댓글