개발/TIL

@EntityGraph 어노테이션

ebang 2025. 2. 24. 23:16

@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 = ?;