본문 바로가기
프레임워크/JPA

[JPA] Entity Graph

by so5663 2023. 10. 24.

Entity Graph

쿼리 메서드마다 연관 관계의 fetch모드를 유연하게 설정할 수 있는 기능을 제공해준다.

 

끝이 One으로 끝나는 연관관계는 기본값이 EAGER모드이고,

끝이 Many로 끝나는 연관관계는 기본값이 LAZY이다.(임의로 모드를 바꿀 수 있다.)

 

@Entity
@Table(name = "account")
@Getter
@NoArgsConstructor
public class Account {
    @ManyToMany
    @JoinTable( // JoinTable은 테이블과 테이블 사이에 별도의 조인 테이블을 만들어 양 테이블간의 연관관계를 설정 하는 방법
            name = "account_authority",
            joinColumns = {@JoinColumn(name = "account_id", referencedColumnName = "account_id")},
            inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "authority_name")})
    private Set<Authority> authorities;
}

Account 엔티티중 일부인데 여기서 @ManyToMany를 사용하여 LAZY 조회가 되기 때문에 

@Entity Graph를 사용할 일이 생겼다.

 

 

public interface AccountRepository extends JpaRepository<Account, Long>, AccountCustomRepository {
    @EntityGraph(attributePaths = "authorities") // 엔티티그래프 통해 EAGER로 가져온다.
    Optional<Account> findOneWithAuthoritiesByUsername(String username); // user를 기준으로 유저를 조회할 때 권한정보도 가져온다.
}

findOneWithAuthoritiesByUsername은 

@EntityGraph 어노테이션으로 authorities도 함께 패치해오도록 해두었기 때문에 1번의 fetch join 쿼리만 실행된다.

 

이런식으로 쿼리가 찍힌다.