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 쿼리만 실행된다.
이런식으로 쿼리가 찍힌다.
'프레임워크 > JPA' 카테고리의 다른 글
[JPA] Hint & Lock (0) | 2024.02.23 |
---|---|
[JPA] 임베디드 타입 (1) | 2023.05.01 |
[JPA] 프록시와 연관관계(즉시로딩, 지연로딩, 영속성 전이) (0) | 2023.04.29 |
[JPA] 상속관계 매핑 (0) | 2023.04.23 |
[JPA] 다대일 [N:1] 일대일 [1:1] 다대다 [N:M] (0) | 2023.04.05 |