BACK-END/Springboot

게시글 검색하기

bameh 2022. 10. 20. 14:56

 

1. 서버측 검색 처리 - DTO 추가

검색 조건으로 사용될 type과 keyword를 추가한다.

@Builder
@AllArgsConstructor
@Data
public class PageRequestDTO {

    private int page;
    private int size;
    private String type;
    private String keyword;

    public PageRequestDTO () {
        this.page = 1;
        this.size = 10;
    }
    public Pageable getPageable(Sort sort){
        return PageRequest.of(page -1, size, sort);
    }
}

 

 

2. 서비스 계층의 검색 구현

동적으로 검색 조건을 처리될 수 있도록 ServiceImpl 내에 메소드를 추가한다.

 private BooleanBuilder getSearch(PageRequestDTO requestDTO) {
        String type = requestDTO.getType();
        String keyword = requestDTO.getKeyword();

        BooleanBuilder booleanBuilder = new BooleanBuilder();
        QJamsilStadium qBearsStadium = QJamsilStadium.jamsilStadium;

        // sno > 0조건 생성
        BooleanExpression expression = qBearsStadium.sno.gt(0L);
        booleanBuilder.and(expression);

        if (type == null || type.trim().length() == 0) {
            return booleanBuilder;
        }

        BooleanBuilder conditionBuilder = new BooleanBuilder();
        if (type.contains("1")) {
            conditionBuilder.or(qBearsStadium.base.contains("1")).and(qBearsStadium.section.contains(keyword));
        }
        if (type.contains("2")) {
            conditionBuilder.or(qBearsStadium.base.contains("2")).and(qBearsStadium.section.contains(keyword));
        }
        if (type.contains("3")) {
            conditionBuilder.or(qBearsStadium.base.contains("3")).and(qBearsStadium.section.contains(keyword));
        }

        // 모든 조건 통합
        booleanBuilder.and(conditionBuilder);
        return booleanBuilder;
    }

getSearch()는 PageRequestDTO를 파라미터로 받는다.

이 때, 검색 조건(type, keyword)이 있는 경우에는 conditionBuilder 변수를 생성해서 각 검색 조건을 or로 연결 처리한다.

만약에 검색 조건이 없다면 sno > 0으로 생성된다.

 

목록을 출력하는 getList() 메소드에서도 검색 조건에 대한 조회가 필요하므로 아래와 같이 수정한다.

 @Override
    public PageResultDTO<StadiumDTO, JamsilStadium> getList(PageRequestDTO requestDTO) {
        Pageable pageable = requestDTO.getPageable(Sort.by("sno").descending());

        // 검색 조건 처리를 위한 추가
        BooleanBuilder booleanBuilder = getSearch(requestDTO);
        Page<JamsilStadium> result = repository.findAll(booleanBuilder, pageable);  // Querydsl 사용

        Function<JamsilStadium, StadiumDTO> fn = (entity -> entityToDTO(entity));
        return new PageResultDTO<>(result, fn);
    }

 

'BACK-END > Springboot' 카테고리의 다른 글

게시글 삭제하기  (0) 2022.10.25
게시글 수정하기  (0) 2022.10.25
게시글 조회하기  (2) 2022.09.26
[Springboot] 동작 원리 - Socket  (0) 2021.12.14
[Springboot] JPA  (0) 2021.12.14