[JPA] BooleanBuilder를 사용한 동적 쿼리와 성능 최적화

윤재열·2022년 9월 24일
0

JPA

목록 보기
17/21
post-custom-banner

1. 성능 최적화를 위해 DB에서 필요한 데이터만 가져올 수 있는 DTO를 생성합니다.

@Data
public class MemberTeamDto{
	
    private Long memberId;
    private String username;
    private int age;
    private Long teamId;
    private String teamName;

public MemberTeamDto(){
}

@QeuryProjection	//1
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;
}
  • 1.@QueryProjection Q-Type을 만들기 위한 어노테이션

2. 동적 쿼리에 사용할 검색 조건 클래스 생성

@data
public class MemberSearchCondition{
	//회원명, 팀명, 나이(ageGoe, ageLoe)
    
    private String username;
    private String teamName;
    private Integer ageGoe;
    private Integer ageLoe;
    
}

3. Repository 에 Builder를 이용한 동적 쿼리 메서드 구현

public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition){

BooleanBuilder builder = new BooleanBuilder();

if( StringUtils.hasText(condition.getUsername())){	//1.
	builder.and(member.username.eq(condition.getUsername)));
}
if( StringUtils.hasText(condition.getTeamName())){	//2.
	builder.and(team.name.eq(condition.getTeamName()));
}
if( condition.getAgeGoe() != null ){	//3.
	builder.and(member.age.goe(condition.getAgeGoe()));
}
if( condition.getAgeLoe() != null ){	//4.
	builder.and(member.age.loe(condition.getAgeLoe()));
}

return queryFactory
		.select(new QMemberTeamDto(
        		member.id.as("memberId"),
                member.username,
                member.age,
                team.id.as("teamID"),
                team.name.as("teamName")))
		.from(member)
        .leftJoin(member.team,team)
        .where(builder)		//5.
        .fetch();
    1. StringUtils.hasText 를 이용하여 null 과 빈문자 체크("") (null or "" 이라면 false)
    1. StringUtils.hasText 를 이용하여 null 과 빈문자 체크("") (null or "" 이라면 false)
    1. ageGoe 가 null 인지 체크
    1. ageLoe 가 null 인지 체크
  • 1,2,3,4 : true 일 경우 builder 에 and 조건 추가
    1. where 문에 builder 적용
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글