[Spring] QueryDSL 로 검색 조건 쿼리시 파라미터 값을 넣어도 전체 검색이 될 때,

Walter Mitty·2023년 6월 5일
0

기존 페이징 + 대상자 목록 검색 기능 구현을 진행하면서 대상자의 '이름'과 '휴대폰번호'로 검색을 해야하는 부분을 추가하려고 한다.

기존

검색 조건 : 대상자 이름

@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class UserReaderListReqeust extends PageAndSizeRequest {

    private String userName; // 검색 키워드가 될 param 이름!
}

기존 전체검색 + 페이징 코드

@Repository
@RequiredArgsConstructor
public class UserReaderCustomRepositoryImpl implements UserReaderCustomRepository {

    private final JPAQueryFactory queryFactory;
    private final QUsers users = QUsers.users;

    @Override
    public Page<UserReaderListDTO> findUserAllList(UserReaderListReqeust userList) {
        Pageable pageable = new PagingRequest(userList.getPage(), userList.getSize()).of();

        long size = queryFactory
            .select(users.id)
            .from(users)
            .fetch().size();

        List<UserReaderListDTO> userAllList = queryFactory
            .select(Projections.constructor(UserReaderListDTO.class,
                users.id,
                users.name,
                users.region,
                users.birth,
                users.tel,
                users.round
            ))
            .from(users)
            .offset(pageable.getOffset())
            .limit(pageable.getPageSize())
            .orderBy(users.round.desc())
            .fetch();

        return new PageImpl<>(userAllList, pageable, size);
    }
}

기존엔 전체 목록을 뽑아주는 거였어서, 따로 where 조건이 붙어 있지 않다.

그래서 여기서 검색 조건을 추가해보자면, 먼저 위 메서드 아래에 BooleanExpression으로 반환되는 검색 메서드를 추가해준다.

검색

이름으로 검색

private BooleanExpression containsNameSearch(String searchWord) {

	if(StringUtils.isBlank(searchWord)) return null;

        return users.name.contains(searchWord);
}

그리고 나서 위의 기존 코드에 .where 로 조건 추가

기존 코드 + where 조건절 추가

@Repository
@RequiredArgsConstructor
public class UserReaderCustomRepositoryImpl implements UserReaderCustomRepository {

    private final JPAQueryFactory queryFactory;
    private final QUsers users = QUsers.users;

    @Override
    public Page<UserReaderListDTO> findUserAllList(UserReaderListReqeust userList) {
        Pageable pageable = new PagingRequest(userList.getPage(), userList.getSize()).of();

        long size = queryFactory
            .select(users.id)
            .from(users)
            .fetch().size();

        List<UserReaderListDTO> userAllList = queryFactory
            .select(Projections.constructor(UserReaderListDTO.class,
                users.id,
                users.name,
                users.region,
                users.birth,
                users.tel,
                users.round
            ))
            .from(users)
            .where(
                containsNameSearch(userList.getUserName())
            )
            .offset(pageable.getOffset())
            .limit(pageable.getPageSize())
            .orderBy(users.round.desc())
            .fetch();

        return new PageImpl<>(userAllList, pageable, size);
    }
}

포스트맨

오류

이렇게 검색시 where 절을 안타고 모든 데이터가 전체 검색이 되었다.

해결방법

해결을 위해 열심히 찾아본 결과, 아주 쉽게 해결할 수 있었다.

문제는 바로 요청을 받는 DTO인 UserReaderListReqeust 클래스에 @Data 어노테이션이 빠져있었던!!!!

어노테이션을 달고 확인해보니 DB에 있는 유저 네임에 "성언"이 들어가는 내 정보만 나온다.

0개의 댓글