@EntityGraph 어노테이션 자세한 설명
1. @EntityGraph란?
@EntityGraph는 JPA의 FetchType.LAZY로 인해 발생하는 N+1 문제를 해결하는 방법 중 하나이다.
- JPA에서 @ManyToOne, @OneToMany 등의 관계를 Lazy Loading으로 설정하면, 연관된 엔티티를 조회할 때 추가적인 SELECT 쿼리가 발생한다.
- @EntityGraph를 사용하면 JPQL이나 Native Query 없이도 한 번의 쿼리로 연관된 엔티티를 함께 조회할 수 있다.
- LEFT JOIN FETCH와 유사한 동작을 수행하는 것이 특징이다.
2. @EntityGraph의 사용 목적
: N+1 문제를 해결하는 등 성능의 최적화에 도움이 된다. Fetch 전략을 지정할 수 있는데, 직접 JPQL 을 작성하지 않고도 그렇게 할 수 있다는 장점이 있다.
3. @EntityGraph 기본 사용법
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY) // Lazy Loading 설정
@JoinColumn(name = "category_id")
private ProductCategory category;
}
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// category 필드를 즉시 로딩 (EAGER Fetch)
@EntityGraph(attributePaths = {"category"})
Optional<Product> findById(Long id);
}
- category는 기본적으로 Lazy 로딩이지만, findById를 호출할 때 한 번의 쿼리로 category까지 로드된다.
- SQL 확인 (category도 함께 가져옴) 결과 :
SELECT p.*, c.* FROM product p
LEFT JOIN product_category c ON p.category_id = c.id
WHERE p.id = ?;
'개발 > TIL' 카테고리의 다른 글
kubernetes에서 yml 로 pod 관리하기 (0) | 2025.02.26 |
---|---|
java record 알차게 사용하기 (0) | 2025.02.25 |
로그인 시 refresh token 을 사용하는 이유와 frontend - backend에서 주의할 점 (3) | 2025.02.23 |
spring boot 애플리케이션에서 null 데이터 처리하기 (0) | 2025.02.22 |
단 한 줄로 spring boot 애플리케이션 성능 올리기 - gzip (0) | 2025.02.21 |