인프런 커뮤니티 질문&답변

gorany님의 프로필 이미지
gorany

작성한 질문수

실전! 스프링 데이터 JPA

Projections

1:N 프로젝션 join

작성

·

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 엔티티의 숫자가 늘어날 수 있어서 최적화가 되지 않을 것 같습니다.

혹시 관련해서 더 아시는 분 있으면 추가 답변 부탁드립니다.

감사합니다.

gorany님의 프로필 이미지
gorany
질문자

앗.. 1:N인데 착각했습니다 감사합니다 ㅠㅠ 질문에 N:1 -> 1:N으로 수정해놓았습니다.

그렇군요 1:N에 대해서는 최적화를 지원해주지 않는 것 같습니다 ㅎㅎ 늦은 시간에도 답변 감사드립니다!!

gorany님의 프로필 이미지
gorany

작성한 질문수

질문하기