검색 처리는 크게 서버 사이드 처리와 화면 쪽의 처리로 나누어 볼 수 있다.
서버 사이드 처리
검색 항목은 크게 아래와 같이 예시를 들었다.
동적으로 검색 조건이 처리되는 경우는 Querydsl을 통해 BooleanBuilder를 작성한다.
@Builder
@AllArgsConstructor
record PageRequestDto(
int page,
int size,
String type,
String keyword
) {
}
@Service
@Slf4j
@RequiredArgsConstructor
public class GuestbookServiceImpl {
// private final
// ... 생략
private BooleanBuilder getSearch(PageRequestDto requestDto) {
//QueryDsl 처리
QGuestbook qGuestbook = QGuestbook.guestbook;
String type = requestDto.type();
String keyword = requestDto.keyword();
BooleanBuilder booleanBuilder = new BooleanBuilder();
BooleanExpression expression = qGuestbook.gno.gt(0L); // gno > 0
booleanBuilder.and(expression);
if (type == null || type.trim().length() == 0) {
//검색 조건이 없는 경우
return booleanBuilder;
}
//검색 조건 작성
BooleanBuilder conditionBuilder = new BooleanBuilder();
if (type.contains("t")) { //제목
conditionBuilder.or(qGuestbook.titile.contains(keyword));
}
if (type.contains("c")) { //내용
conditionBuilder.or(qGuestbook.content.contains(keyword));
}
if (type.contains("w")) { //작성자
conditionBuilder.or(qGuestbook.writer.contains(keyword));
}
//모든 조건 통합
booleanBuilder.and(conditionBuilder);
return booleanBuilder;
}
}
/* 위에서 만든 메서드 사용 */
public PageRusultDTo<GuestBookDto, Guestbook> getList(PageRequestDto requestDto) {
Pageable pageable = // 각자 작성
BooleanBuilder booleanBuilder = getSearch(requestDto);
Page<Guestbook> result = repository.findAll(booleanBuilder, pageable); //QueryDsl 동작
Function<Guestbook, GuestbookDto> fn = (entity -> entityToDto(entity));
return new PageResultDto<>(result, fn);
}