Spring Data

[Querydsl] 연관관계 없이 Join 조회하기

향로 (기억보단 기록을) 2019. 1. 29. 08:48
반응형

안녕하세요? 이번 시간엔 Querydsl에서 연관관계 없이 Join 조회하기 예제를 진행해보려고 합니다.
모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다.
(공부한 내용을 정리하는 Github와 세미나+책 후기를 정리하는 Github, 이 모든 내용을 담고 있는 블로그가 있습니다. )

본문

많은 분들이 Querydsl 대신에 Jooq를 사용하는 이유로 Querydsl은 연관 관계(relationship) 없이는 조인을 맺지 못하기 때문이라고 합니다.

연관 관계란 아래와 같이 관계가 맺어져있는 것을 얘기합니다.

실제로 Querydsl의 예전 버전들에서는 지원이 안됐습니다.
(정확히 몇 버전부터인지는 잊어먹어서 ㅠㅠ)

하지만 요즘 버전들에서는 연관 관계 없이 조인이 되는 기능을 지원합니다.

아래와 같이 join(엔티티).on(키.eq(키)) 로 SQL과 유사한 형태로 작성이 가능합니다.

    @Override
    public List<AcademyTeacher> findAllAcademyTeacher() {
        return queryFactory
                .select(Projections.fields(AcademyTeacher.class,
                        academy.name.as("academyName"),
                        teacher.name.as("teacherName")
                ))
                .from(academy)
                .join(teacher).on(academy.id.eq(teacher.academyId))
                .fetch();
    }

어렵지 않죠?
이외에도 아래와 같이 동적인 조건을 넣어서도 조인이 가능합니다.

자 그럼 위 코드가 정상적으로 작동하는지 테스트에서 확인해보면!

@Test
    public void 관계없을때_조인_맺기() {
        //given
        String academyName = "name";
        academyRepository.saveAll(Arrays.asList(
                new Academy(academyName, "", ""),
                new Academy("not target", "", "")
        ));

        String teacherName = "teacher";
        teacherRepository.save(new Teacher(teacherName, "Java", 1L));

        //when
        List<AcademyTeacher> academyTeachers = academyRepository.findAllAcademyTeacher();

        //then
        assertThat(academyTeachers.size(), is(1));
        assertThat(academyTeachers.get(0).getAcademyName(), is(academyName));
        assertThat(academyTeachers.get(0).getTeacherName(), is(teacherName));
    }

아래와 같이 정상적으로 작동하는 것을 확인할 수 있습니다.

이젠 연관 관계가 없어 Querydsl를 사용하지 않을 이유가 없겠죠?


반응형