작성
·
184
1
안녕하세요!
중첩 프로젝션에 대해 이것저것 해보는 도중, 1:N에 대해서도 인터페이스를 만들어 해보았습니다.
예를 들어 TeamProjection이 있을 때, 다음과 같습니다.
public interface TeamProjection {
String getName();
List<MemberInfo> getMembers();
interface MemberInfo{
String getUsername();
}
}
Team과 member의 관계는 강의에서와 동일하게 1:N 관계입니다.
TeamRepository에 메서드를 다음과 같이 정의했습니다.
public interface TeamRepository extends JpaRepository<Team, Long> {
<T> List<T> findProjectionByName(@Param("name") String name, Class<T> tClass);
}
이제 Test를 돌리기 위해 다음과 같이 테스트코드를 짜고 실행했을 때 SQL 결과입니다.
@Test
@DisplayName("프로젝션 테스트")
public void 프로젝션_테스트() throws Exception{
//given
Team team = Team.builder().name("team").build(); em.persist(team);
Member m1 = builder().username("a").age(10).team(team).build(); em.persist(m1);
Member m2 = builder().username("b").age(10).team(team).build(); em.persist(m2);
em.flush();
em.clear();
//when
List<TeamProjection> r = teamRepository.findProjectionByName("team", TeamProjection.class);
//then
for (TeamProjection teamProjection : r) {
List<TeamProjection.MemberInfo> members = teamProjection.getMembers();
for (TeamProjection.MemberInfo m : members) {
System.out.println("member : " + m.getUsername());
}
System.out.println("team : " + teamProjection.getName());
}
}
>> SQL (Team + Member + Member) 총 3회
select
team0_.team_id as team_id1_4_,
team0_.name as name2_4_
from
team team0_
where
team0_.name=?
-------
select
members0_.team_id as team_id4_3_0_,
members0_.member_id as member_i1_3_0_,
members0_.member_id as member_i1_3_1_,
members0_.age as age2_3_1_,
members0_.team_id as team_id4_3_1_,
members0_.username as username3_3_1_
from
member members0_
where
members0_.team_id=?
--------
select
members0_.team_id as team_id4_3_0_,
members0_.member_id as member_i1_3_0_,
members0_.member_id as member_i1_3_1_,
members0_.age as age2_3_1_,
members0_.team_id as team_id4_3_1_,
members0_.username as username3_3_1_
from
member members0_
where
members0_.team_id=?
질문) 1:N은 프로젝션 조회를 했을 때 join이 되지 않는 것인지 궁금합니다!
답변 1
0
안녕하세요. gorany님
1:N 프로젝션 이네요. 하나의 Team, 다수의 Member니까요.
이 경우는 fetch join이 발생해야 하고 조인시 root 엔티티의 숫자가 늘어날 수 있어서 최적화가 되지 않을 것 같습니다.
혹시 관련해서 더 아시는 분 있으면 추가 답변 부탁드립니다.
감사합니다.
앗.. 1:N인데 착각했습니다 감사합니다 ㅠㅠ 질문에 N:1 -> 1:N으로 수정해놓았습니다.
그렇군요 1:N에 대해서는 최적화를 지원해주지 않는 것 같습니다 ㅎㅎ 늦은 시간에도 답변 감사드립니다!!