검색 처리는 크게 서버 사이드 처리와 화면 쪽의 처리로 나누어 볼 수 있다.

4.10.1 서버측 검색 처리

서버 사이드 처리

검색 항목은 크게 아래와 같이 예시를 들었다.

4.10.2 서비스 계층의 검색 구현과 테스트

동적으로 검색 조건이 처리되는 경우는 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);        
}