실행 시 쿼리(query)를 확인해 보면 아래 코드처럼 지연로딩 의 경우 member 객체만 조회하고 team 객체는 proxy 객체(Object)가 대체되어 들어간다.
Java
위의 코드처럼 리파지터리(Repository)에 오버라이딩(Overriding)한 다음 @EntitiyGraph를 실행시켜 보면 team 엔티티를 함께 조회하는 것 을 확인할 수 있다.
Synapse Map Insight
packagestudy.datajpa.entity;importlombok.*;importjavax.persistence.*;importstaticjavax.persistence.FetchType.*;@Entity@Getter@Setter@NoArgsConstructor(access =AccessLevel.PROTECTED)// 기본생성자를 만들어 주는 기능publicclassMemberextendsBaseEntity{@Id@GeneratedValue(strategy =GenerationType.AUTO)@Column(name ="member_id")privateLongId;privateString username;privateint age;@ManyToOne(fetch = LAZY)@JoinColumn(name ="team1_id")privateTeam team;publicMember(String username){this.username = username;}}
packagestudy.datajpa.entity;importlombok.*;importjavax.persistence.*;importjava.util.ArrayList;importjava.util.List;importstaticjavax.persistence.CascadeType.ALL;@Entity@Getter@Setter@NoArgsConstructor(access =AccessLevel.PROTECTED)publicclassTeam{@Id@GeneratedValue@Column(name ="team_id")privateLong id;privateString name;@OneToMany(mappedBy ="team", cascade = ALL, orphanRemoval =true)privateList<Member> members =newArrayList<>();publicTeam(String name){this.name = name;}}
@TestpublicvoidbasicCRUD(){Member member1 =newMember("member1");Member member2 =newMember("member2"); memberRepository.save(member1); memberRepository.save(member2);List<Member> all = memberRepository.findAll();assertThat(all.size()).isEqualTo(2);}
publicinterfaceMemberRepositoryextendsJpaRepository<Member,Long>,MemberRepositoryCustom{@Override//기본 적으로 findAll 을 제공하기 때문에 Override 하여 재정의 후 사용 @EntityGraph(attributePaths ={"team"})// DataJpa 에서 fetch 조인을 하기 위한 설정List<Member>findAll();}