강의

멘토링

로드맵

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

gorany님의 프로필 이미지
gorany

작성한 질문수

실전! 스프링 데이터 JPA

Projections

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

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

감사합니다.

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

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

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

gorany님의 프로필 이미지
gorany

작성한 질문수

질문하기