728x90
반응형
@EntityGraph 란?
연관관계가 있는 엔티티를 조회할 경우 지연 로딩으로 설정되어 있으면 연관관계에서 종속된 엔티티는
쿼리 실행 시 select 되지 않고 proxy 객체를 만들어 엔티티가 적용시킨다. 그 후 해당 프락시 객체를 호출할 때마다 그때그때 select 쿼리가 실행된다. 자세한 사항은 JPA의 지연 로딩에 관하여 찾아보자.
위 같은 연관관계가 지연 로딩으로 되어있을 경우 fetch 조인을 사용하여 여러 번의 쿼리를 한 번에 해결할 수 있다.
@EntityGraph는 Data JPA에서 fect 조인을 어노테이션으로 사용할 수 있도록 만들어 준 기능이다.
Entity
package study.datajpa.entity;
import lombok.*;
import javax.persistence.*;
import static javax.persistence.FetchType.*;
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본생성자를 만들어 주는 기능
public class Member extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "member_id")
private Long Id;
private String username;
private int age;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "team1_id")
private Team team;
public Member( String username) {
this.username = username;
}
}
package study.datajpa.entity;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.CascadeType.ALL;
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {
@Id
@GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team",cascade = ALL,orphanRemoval = true)
private List<Member> members = new ArrayList<>();
public Team(String name) {
this.name = name;
}
}
Test Class
@Test
public void basicCRUD() {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberRepository.save(member1);
memberRepository.save(member2);
List<Member> all = memberRepository.findAll();
assertThat(all.size()).isEqualTo(2);
}
실행 시 쿼리를 확인해 보면
위처럼 지연로딩 의 경우 member 객체만 조회하고 team 객체는 프락시 객체가 대체되어 들어간다.
Repository
public interface MemberRepository extends JpaRepository<Member,Long> ,MemberRepositoryCustom{
@Override //기본 적으로 findAll 을 제공하기 때문에 Override 하여 재정의 후 사용
@EntityGraph(attributePaths = {"team"}) // DataJpa 에서 fetch 조인을 하기 위한 설정
List<Member> findAll();
}
위 처럼 코드를 재정의 한 다음 실행시켜 보면
team 엔티티를 함께 조회하는 것 을 확인할 수 있다.
728x90
반응형
'Spring & Spring Boot' 카테고리의 다른 글
[ Spring Cloud ] 마이크로서비스 와 클라우드 개념정리 - 2편 (0) | 2021.07.15 |
---|---|
[ Spring Cloud ] 마이크로서비스 와 클라우드 개념정리 - 1편 (0) | 2021.07.15 |
[ Spring-Boot ] Data - JPA 사용하기 (0) | 2021.06.14 |
Spring Cloud Netflix - Eureka (0) | 2021.06.11 |
[ Spring-Boot ] JPA QueryDsl 정렬 사용하기 (1) | 2021.05.23 |