-
동적 쿼리와 성능 최적화 조회이커머스 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'이커머스 devops > 국비교육' 카테고리의 다른 글
Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: (0) 2025.11.22 실무 활용 - 스프링 데이터 JPA와 Querydsl (0) 2025.11.19 QueryDSL 중급 문법 (0) 2025.11.19 QueryDSL 기본 문법 (0) 2025.11.19 영속성 컨텍스트와 트랜잭션 & QueryDSL (0) 2025.11.16