기존 방식
- 검색 페이지(/search)에 들어가 상품 이름(”productName”)를 검색시, %LIKE% 사용해 productName과 겹치는 상품 리스트를 클라이언트에게 전달
@Query("SELECT p FROM Product p " +
"WHERE p.name LIKE %:productName% " +
"AND p.deletedAt IS NULL " +
"AND p.isExposed = true " +
"AND p.productStatus = com.freeder.buclserver.domain.product.vo.ProductStatus.ACTIVE " +
"ORDER BY p.productPriority DESC")
Page<Product> findProductsBySearchByConditions(
@Param("productName") String productName,
Pageable pageable
);
문제점
- 띄어쓰기 오타에 대해서 해당 상품을 검색하지 못하는 문제
원인 분석
- %LIKE% 검색의 경우 문자열이 정확히 일치해야 하기 때문에, “유모 차”와 “유모차”를 다른 단어로 인식
- 상품 검색시 상품 리스트를 가져오는 데 오래 걸리는 문제
- 가짜 상품 데이터 1,000개로 테스트를 진행했습니다.
- 개발자 도구의 네트워크를 확인해본 개발 상품 리스트를 가져오는 데, 걸리는 시간은 평균 500ms로 유저 사용했을 때 사용성이 좋지 않는 문제가 있습니다.
- 1,000개 상품에 대해서 대략 500ms 속도 → 상품이 10,000, 100,000 일 경우 매우 늘려지는 문제
[문제 접근]
- Elastic Search를 사용하는 경우
- Full Text Search를 사용하는 경우
1. Elastic Search를 사용하는 경우