본문 바로가기

Spring Boot/Spring Boot

62 : 검색기능 + 카테고리 (SpringbootAPi + JPA)

카테고리(제목/내용/작성자)를 선택 후 검색하는 기능을 만들어보자.

위 사진은 Jspmvc에서 구현한 모습이다.

SpringbootApi는 Postman가 클라이언트 역할을 하므로 값을 직접 넣어줘야한다

(변수 stype가 위 사진의 "제목"을 선택하는 부분, svalue가 검색하는 부분이다)

 

BoardJpaController의 @RequestParam

리스트 출력 페이지에 검색기능을 넣기위해서 url로 들어오는 검색값에

String형 null값을 허용하기 위해서 @RequestParam ( required = false ) 를 추가해줬다.

-> 검색을 위한 stype(카테고리), svalue(검색값) 값을 넣지않으면 원래의 전체 리스트를 보여주게 만들것이다.

    @GetMapping(value = "/")
    public ApiResponse<BoardDTO> getBoardList(@RequestParam int page, @RequestParam int size,
                                              @RequestParam(required = false) String stype , 
                                              @RequestParam(required = false) String svalue){
        Page<Board> list = boardJpaService.getBoardList(page, size, stype ,svalue);
        return new ApiResponse(true, list);
    }

 

 

Service에 검색기능 코드를 작성

switch-case 문과 쿼리메소드로 작성하여 구현하였다.

  • 검색값 svalue가 null이면 전체 리스트를 출력한다
  • 카테고리 stype의 값에 따라서 사용자명, 내용, 제목 으로 검색이 가능하다

부분일치 검색을 위해 쿼리메소드에 들어가는 검색값 (svalue)에 직접 "%" 를 붙여줬다

    public Page<Board> getBoardList(int page, int size, String stype, String svalue) {

        PageRequest pageRequest = PageRequest.of(page, size);
        if(svalue==null){
            return boardRepository.findBoardsByIsDelOrderByReplyRootIdDescOrderNumAsc("N", pageRequest);
        }
        
        String svalue2 = "%"+svalue+"%";
        switch (stype){
            case "author":
                return boardRepository.findBoardByIsDelAndAuthorLikeOrderByReplyRootIdDescOrderNumAsc("N",svalue2,pageRequest);
            case "subject":
                log.debug("1: "+stype +" 2: "+svalue);
                return boardRepository.findBoardByIsDelAndSubjectLikeOrderByReplyRootIdDescOrderNumAsc("N",svalue2,pageRequest);
            case "content":
                return boardRepository.findBoardByIsDelAndContentLikeOrderByReplyRootIdDescOrderNumAsc("N",svalue2,pageRequest);
            default:
                return null;
        }

 

 

 

실행화면

 

제목으로 검색한 결과값
검색값을 빼고 검색하면 전체 리스트가 출력된다

 

후기

1. 부분검색

 "%"를 달지않고 부분값을 입력해서 값이 계속 안나와서 찾느라 좀 고생한거 말고는

 jspmvc보다 훨씬 쉽게 구현했다.

2. switch-case

 오랜만에 if문 말고 switch-case를 사용해봤는데 String이 들어간 switch문은 

 if문보다 성능이 훨씬 떨어진다고 한다..

 (원래는 switch에 String을 넣을 수 없었는데 JDK 1.7 이후부터 String in switch Statements가 추가되었다)