꿈틀꿈틀 개발일기

오류 | 페이징+정렬+검색 기능의 캐싱 시도시 IlligalArgumentException 발생

by jeongminy

들어가기 전에

기존 service부분 코드는 이러했다.

    @Cacheable(key = "#keywords", value = ["keyword"], unless = "#keywords.trim().isEmpty()")
    override fun getItemListPaginated(
        page: Int,
        sortOrder: SortOrder?,
        itemTag: ItemTag,
        keywords: String?
    ): Page<ItemResponseDto> {
        return itemRepository.findByPageable(page, sortOrder, itemTag, keywords).map { it.toResponseDto() }
    }

상품검색 기능에 페이징과 정렬과 검색을 한번에 넣어서 동적쿼리로 구현한 기능이다.

여기에 인기검색어 기능을 구현하기 위해 keyword만 캐싱을 하기 위해서 @Cacheable 로 구현한 부분이다.

 

테스트 시도

기존에 우리는 상품검색 기능에는 keywords에 값을 넣지 않아도 검색이 되도록 되어있었다.

 

오류발생

여기에 keywords에 어떠한 값도 넣지 않고 캐시시도를 하려고 해서 오류가 발생한 것으로 보였다.

 

시도1

그렇다면, keywords가 null일 때에는 캐싱을 하지 않도록 설정해 보았다.

 

변경전: unless = "#keywords.trim().isEmpty()" 

변경후: unless = "#keywords == null or #keywords.trim().isEmpty()"

    @Cacheable(key = "#keywords", value = ["keyword"], unless = "#keywords == null or #keywords.trim().isEmpty()")
    override fun getItemListPaginated(
        page: Int,
        sortOrder: SortOrder?,
        itemTag: ItemTag,
        keywords: String?
    ): Page<ItemResponseDto> {
        return itemRepository.findByPageable(page, sortOrder, itemTag, keywords).map { it.toResponseDto() }
    }

500 오류코드와 동일한 현상과 함께 오류가 해결이 되지 않았다...

여기서 들었던 생각은 keywords 뿐만이 아닌 다른 값들에도 영향이 있나 싶었다.

 

시도2

그래서 아예 keywords값이 "있을 때에만" 캐싱을 하도록 설정해보았다.

 

변경전: unless = "#keywords == null or #keywords.trim().isEmpty()"

변경후: condition = "#keywords != null"

    @Cacheable(key = "#keywords", value = ["keyword"], condition = "#keywords != null")
    override fun getItemListPaginated(
        page: Int,
        sortOrder: SortOrder?,
        itemTag: ItemTag,
        keywords: String?
    ): Page<ItemResponseDto> {
        return itemRepository.findByPageable(page, sortOrder, itemTag, keywords).map { it.toResponseDto() }
    }

 

 

오류개선

결과는 성공이다!

 

 

블로그의 정보

꿈틀꿈틀 개발일기

jeongminy

활동하기