ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동적 쿼리와 성능 최적화 조회
    이커머스 devops/국비교육 2025. 11. 19. 14:17

    동적 쿼리와 성능 최적화 조회 - Builder 사용

    // MemberTeamDto - 조회 최적화용 DTO 추가
    @Data
    public class MemberTeamDto {
        private Long memberId;
        private String username;
        private int age;
        private Long teamId;
        private String teamName;
        
        @QueryProjection
        public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) {
            this.memberId = memberId;
            this.username = username;
            this.age = age;
            this.teamId = teamId;
            this.teamName = teamName;
        }
    }
    
    // 회원 검색 조건
    @Data
    public class MemberSearchCondition {
        // 회원명, 팀명, 나이(ageGoe, ageLoe)
        private String username;
        private String teamName;
        private Integer ageGoe;
        private Integer ageLoe;
    }
    // MemberJpaRepository
    public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition) {
        BooleanBuilder builder = new BooleanBuilder();
        if (hasText(condition.getUsername())) {
            builder.and(member.username.eq(condition.getUsername()));
        }
        
        if (hasText(condition.getTeamName())) {
            builder.and(team.name.eq(condition.getTeamName()));
        }
        if (condition.getAgeGoe() != null) {
            builder.and(member.age.goe(condition.getAgeGoe()));
        }
        if (condition.getAgeLoe() != null) {
            builder.and(member.age.loe(condition.getAgeLoe()));
        }
        return queryFactory
                .select(new QMemberTeamDto(
                        member.id,
                        member.username,
                        member.age,
                        team.id,
                        team.name))
                .from(member)
                .leftJoin(member.team, team)
                .where(builder)
                .fetch();
     }

     

     

    cf. Q 파일 인식 안됨

    분명 build 아래에 생성된 것을 확인했고 entity들은 import 되는데 dto들이 import 되지 않는 문제가 발생했다 

     

     

    build.gradle의 여러 설정을 바꿔줬지만 import할 수 없었고 해결법은 빌드도구였다

     

     

    설정 > 필드,실행,배포 > 빌드도구 > gradle > Gradle(디폴트)로 변경했다

    원래는 intelliJ IDE 빌드가 조금 더 빠르다고 해서 intelliJ IDE 빌드를 사용하고 있었는데 IntelliJ로 빌드하면 annotation processing 쪽이 꼬일 때가 있다고 한다 

     

     

    해당 부분을 gradle로 바꿔주고 나니 정상적으로 import 되었다 

     

     

    동적 쿼리와 성능 최적화 조회 - Where절 파라미터 사용

    // MemberJpaRepository
    public List<MemberTeamDto> search(MemberSearchCondition condition) {
        return queryFactory
                .select(new QMemberTeamDto(
                        member.id,
                        member.username,
                        member.age,
                        team.id,
                        team.name))
                .from(member)
                .leftJoin(member.team, team)
                .where(usernameEq(condition.getUsername()),
                        teamNameEq(condition.getTeamName()),
                        ageGoe(condition.getAgeGoe()),
                        ageLoe(condition.getAgeLoe()))
                .fetch();
    }
    
    private BooleanExpression usernameEq(String username) {
        return isEmpty(username) ? null : member.username.eq(username);
    }
    
    private BooleanExpression teamNameEq(String teamName) {
        return isEmpty(teamName) ? null : team.name.eq(teamName);
    }
    
    private BooleanExpression ageGoe(Integer ageGoe) {
        return ageGoe == null ? null : member.age.goe(ageGoe);
    }
    
    private BooleanExpression ageLoe(Integer ageLoe) {
        return ageLoe == null ? null : member.age.loe(ageLoe);
    }
    728x90
Designed by Tistory.