category, 날짜 등으로
필터링 처리가 된검색 결과를 전달하기 위해서
검색 필터링 api를 구현했다.
1. SearchRequestDto와 SearchResponseDto를 작성
위 모든 파라미터 값을 다 채울 필요는 없다.
2. RestController 작성.
SearchRequestDto와 page, size의 정보를 파라미터로 받는다.
3. EventRepository에 검색 method 추가
SearchRequestDto의 각 항목마다 따로따로 method를 작성했다.
원래는 mysql 쿼리 하나로 통합검색을 구현하려고 했다.
그러나,
여러개의 keywords가 입력으로 들어오는 경우,
keyword를 단어 여러개로 쪼개는 작업이 필요하다.
그리고 각 키워드에 대해서 검색한 리스트를 합쳐야 한다.
예를 들어서 "프린트 창업"이라는 문자열이 들어온 경우,
이것을 "프린트 창업"을 포함하는 제목으로 검색하면 곤란하다.
"프린트"와 "창업"을 나눠 검색한 결과를 합쳐줘야한다.
따라서 내가 생각한 것은 각각 따로 method를 만들어서 이것을 Service에서 합쳐주는 것이다.
5. EventService에 getSearchEvents 함수 작성
keywords가 널이 아닌 경우, 공백을 기준으로 나눈다.
나눈 결과를 가지고, 각 키워드에 대해 이벤트를 검색하고 결과 리스트에 추가한다.
여기서 포인트는
키워드 검색 결과, 일치하는 이벤트가 존재하지 않을 경우,
바로 리턴해줘야한다.
안그러면 아래 코드에서 다른 기준으로 검색을 또 실시할텐데,
여기서 새로운 이벤트들이 결과 리스트에 추가될 가능성이 있다.
이렇게 되면, 원하는 결과리스트와 다른 결과 리스트를 반환하게 된다.
예를 들면, "프린트 창업"의 검색 결과가 존재하지 않는 경우에,
카테고리 창업의 필터링 검색을 한 경우,
결과리스트에 카테고리 창업의 결과들이 주루룩 들어갈 것이다. 이것은 잘못된 결과이다.
왜 이렇게 되는 지는 이어지는 코드를 보면 정확히 알 수 있다.
코드를 보면 알 수 있지만, 결과 리스트가 비어있는 지를 기준으로, 교집합을 실행하기 때문에 그렇다.
결과 리스트가 비어있지 않으면, 날짜 검색으로 나온 dateEvents를 결과 리스트에 교집합한다.
결과 리스트가 비어있지 않으면, 결과 리스트에 dateEvents를 추가해준다.
이렇게 검색 필터링 처리를 구현해봤다.
야호!
'프로젝트 > 잇타' 카테고리의 다른 글
AWS S3를 사용하여 파일업로드 (0) | 2022.12.27 |
---|---|
리눅스(linux) 실행권한 (0) | 2022.12.04 |
branch 사용법 (0) | 2022.11.19 |
백엔드 소셜로그인 구현 - 최대한 간략하게 (0) | 2022.11.12 |