Spring & Spring Boot

[ Spring-Boot ] JPA @EntityGraph 사용하기

사과씨앗 2021. 6. 14. 16:51
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
반응형