diff --git a/src/main/java/org/websoso/WSSServer/repository/NovelCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/NovelCustomRepositoryImpl.java index 8c2b3f4a..3ca26356 100644 --- a/src/main/java/org/websoso/WSSServer/repository/NovelCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/NovelCustomRepositoryImpl.java @@ -34,11 +34,10 @@ public class NovelCustomRepositoryImpl implements NovelCustomRepository { private final JPAQueryFactory jpaQueryFactory; @Override - public Page findSearchedNovels(Pageable pageable, String query) { - String searchQuery = query.replaceAll("\\s+", ""); + public Page findSearchedNovels(Pageable pageable, String searchQuery) { - BooleanExpression titleContainsQuery = getSpaceRemovedString(novel.title).containsIgnoreCase(searchQuery); - BooleanExpression authorContainsQuery = getSpaceRemovedString(novel.author).containsIgnoreCase(searchQuery); + BooleanExpression titleContainsQuery = getCleanedString(novel.title).containsIgnoreCase(searchQuery); + BooleanExpression authorContainsQuery = getCleanedString(novel.author).containsIgnoreCase(searchQuery); List novelsByTitle = jpaQueryFactory .selectFrom(novel) @@ -67,9 +66,9 @@ public Page findSearchedNovels(Pageable pageable, String query) { return new PageImpl<>(result.subList(start, end), pageable, total); } - private StringTemplate getSpaceRemovedString(StringPath stringPath) { + private StringTemplate getCleanedString(StringPath stringPath) { return Expressions.stringTemplate( - "REPLACE(REPLACE({0}, ' ', ''), CHAR(9), '')", + "CAST(REGEXP_REPLACE(REPLACE(REPLACE({0}, ' ', ''), CHAR(9), ''), '[^a-zA-Z0-9가-힣]', '') AS STRING)", stringPath ); } diff --git a/src/main/java/org/websoso/WSSServer/service/NovelService.java b/src/main/java/org/websoso/WSSServer/service/NovelService.java index 646372bc..3d4e1de7 100644 --- a/src/main/java/org/websoso/WSSServer/service/NovelService.java +++ b/src/main/java/org/websoso/WSSServer/service/NovelService.java @@ -280,12 +280,13 @@ public FilteredNovelsGetResponse getFilteredNovels(List genreNames, Bool @Transactional(readOnly = true) public SearchedNovelsGetResponse searchNovels(String query, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); + String searchQuery = query.replaceAll("\\s+", "").replaceAll("[^a-zA-Z0-9가-힣]", ""); - if (query.isBlank()) { + if (searchQuery.isBlank()) { return SearchedNovelsGetResponse.of(0L, false, Collections.emptyList()); } - Page novels = novelRepository.findSearchedNovels(pageRequest, query); + Page novels = novelRepository.findSearchedNovels(pageRequest, searchQuery); List novelGetResponsePreviews = novels.stream() .map(this::convertToDTO)