인프런 커뮤니티 질문&답변
1:N 프로젝션 join
작성
·
238
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이 되지 않는 것인지 궁금합니다!
퀴즈
Spring Data JPA에서 Projections를 사용하는 주된 목적은 무엇인가요?
복잡한 동적 검색 조건 구성
엔티티의 특정 필드만 선택하여 조회
원시 SQL 쿼리 직접 실행
예제 객체로 간단히 검색
답변 1
0
안녕하세요. gorany님
1:N 프로젝션 이네요. 하나의 Team, 다수의 Member니까요.
이 경우는 fetch join이 발생해야 하고 조인시 root 엔티티의 숫자가 늘어날 수 있어서 최적화가 되지 않을 것 같습니다.
혹시 관련해서 더 아시는 분 있으면 추가 답변 부탁드립니다.
감사합니다.






앗.. 1:N인데 착각했습니다 감사합니다 ㅠㅠ 질문에 N:1 -> 1:N으로 수정해놓았습니다.
그렇군요 1:N에 대해서는 최적화를 지원해주지 않는 것 같습니다 ㅎㅎ 늦은 시간에도 답변 감사드립니다!!