지난 번에는 Fetch전략인 LAZY와 EAGER에 대해 알아봤다. 하지만 조회된 테이블의 연관관계 된 테이블까지 써야한다면 @EntityGraph를 사용하는게 좋다. 이 글에서는 @EntityGraph에 대해서 다뤄볼 예정입니다.
n+1이 뭔지 Fetch전략에 대해서 잘 모르신다면 아래 링크를 먼저 읽어보는 것도 좋을 것 같습니다.
2022.08.03 - [데이터베이스/JPA] - [JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1)
@EntityGraph란?
엔티티 및 연관된 엔티티를 로드할 때 성능이 향상되고 JOIN 전략을 사용하여 그래프의 정의된 방식으로만 데이터를 검색하기 때문에 데이터베이스의 모든 정보를 한 번에 조회할 수 있습니다.
왼쪽은 그냥 조회를 할 경우 조회문이 2번 발생했습니다.오른쪽은 EntityGraph를 사용했을 때 join을 사용하여 쿼리문이 하나만 발생되었습니다. 아래의 예시는 연관관계가 하나밖에 없을 경우지만 연관관계가 많다면 더욱 EntityGraph의 중요성을 깨닫게됩니다.
@EntityGraph 예제
아래 Car 클래스는 master와 n : 1 연관관계가 맺여진 상태입니다.
@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Master master;
public Car() {}
}
첫번째
첫번째 방법은 매우 간단합니다. @EntityGraph 어노테이션을 사용하고 attributePaths 속성에 join하고 싶은 변수명을 써주면 됩니다. 예를 들면 위 Car라는 클래스 안에 Maste 클래스는 연관관계가 되어있고 변수명이 master 입니다. 즉 , attributePaths = "master" 라고 해주시면됩니다.
public interface CarRepository extends JpaRepository<Car, Long> {
@Override
@EntityGraph(attributePaths = "master")
Optional<Car> findById(Long aLong);
}
두번째
두번째 방법으론 @NamedEntityGraph를 이용하여 Entity클래스에서 정의해주는 방법인데요 @NamedEntityGraph 속성에 name에는 repository에서 사용할 이름을 정의해주고 attributeNodes속성은 join을 해줄 연관관계가된 클래스의 변수명을 적어주면 됩니다.
@Entity
@NamedEntityGraph(name = "car.fetchMaster", attributeNodes = @NamedAttributeNode("master"))
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Master master;
}
그리고 repository에서 @EntityGraph 에는 다른 속성없이 @NamedEntityGraph에 정의해준 이름을 적어주면 됩니다.
public interface CarRepository extends JpaRepository<Car, Long> {
@Override
@EntityGraph("car.fetchMaster")
Optional<Car> findById(Long aLong);
}
참고하며 좋은 자료 및 참고했던 자료
'데이터베이스 > JPA' 카테고리의 다른 글
[JPA] JPQL @Query에 각 DB function() 사용해보기 (0) | 2022.12.31 |
---|---|
[JPA] Pageable과 countQuery 사용한 Spring-Data FETCH JOIN (0) | 2022.11.24 |
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1) (0) | 2022.08.03 |
[JPA] JPA로 Pageable사용해서 페이징 처리하기 (0) | 2022.06.29 |
[JPA] JPA 대해서 (0) | 2022.06.29 |