기존 페이징 + 대상자 목록 검색 기능 구현을 진행하면서 대상자의 '이름'과 '휴대폰번호'로 검색을 해야하는 부분을 추가하려고 한다.
@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
로 조건 추가
@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에 있는 유저 네임에 "성언"이 들어가는 내 정보만 나온다.