Blog

[Spring][258] 검색관련 문제해결 및 성능 개선 방안 수집

Category
Author
Tags
PinOnMain
1 more property
검색 구현 후 느린 검색 속도
도입 이유
문제 상황
검색에 7~10초 가량 소요될 정도로 시간이 오래걸림
→ 이 시간이 오래걸리는것이, 페이징 때문인지 파악하기가 어려움.
→ 콘솔 로그에서 단순 시간 체크를 해보니 전체 페이지숫자를 연산하는것때문에 느리다
해결 방안 의견
%KEYWORD%와 같은 like절의 키워드 검색 속도를 개선 할 수 있는 방법이 없을지 파악 필요
검색 쿼리 최적화: 검색 쿼리를 최적화하여 불필요한 부하를 줄이고 더 효율적으로 데이터를 가져올 수 있도록 개선하는 것이 중요
Full-Text Search Index 검색은 자연어 처리에 기반하고 있어 사용자가 검색할 때 사용하는 언어의 특성을 고려할 수 있어요. 이를 통해 더 유연한 검색이 가능하며, 대용량의 텍스트 데이터에서 효과적으로 활용될 수 있다.
ElasticsearchSolr 같은 검색 엔진을 도입하면 검색 엔진은 대용량 데이터에서 빠르고 효율적인 검색을 지원하며, 다양한 기능과 유연성을 제공
캐싱 활용 자주 사용되는 검색어나 결과를 캐싱하여 중복 검색 요청 개선
파티셔닝 및 샤딩: 데이터를 파티셔닝하거나 샤딩하여 검색 범위를 축소
의사 결정
검색 결과가 다수 나타날 때 [페이징] 자체가 성능을 좌우하는 문제
도입 이유
도서 키워드 검색 시 키워드 검색 결과에 대해서도 페이징 처리가 추가되어있음
해당 페이징 링크를 이동할 때도 첫 키워드 검색과 유사한 시간이 소요됨
유저 - 도서 대출 등 서비스 이용용도 도서 검색 기능 화면
관리자 - 도서 관리용 도서 검색 화면
문제 상황
검색 이후 결과가 10개 이상인 경우 페이지 링크는 다음처럼 키워드를 유지하도록 작성한 상태
따라서 다음 페이지 링크를 클릭하는 행위은 결과적으로 키워드 검색+2페이지 이동 요청임
사실상 페이징 링크를 들어가는것 = 검색을 또하는것
→ 검색이 10초 걸린다면 페이지 이동시 마다 10초가 소요된다.
우선 이것 자체가 검색 성능의 문제인가?
실제로 검색 성능은 1초 미만으로 미미한 상태이며
과도한 시간이 소요되는 것은 페이징 카운트 연산에서 소모되고 있다.
그럼 이것을 해결한 이후에 검색 성능에 집중해서 테스트 해야 실제 검색성능 개선이 아닐까?
우선 페이징 최적화가 우선 필요하다는 말.
해결 방안 의견
페이징의 접근 방식 변경(이것이 우선되어야 실제 ‘검색’ 성능에 집중 할 수 있다.)
슬라이스
페이지를 나누어 보여주는 대신, 처음에 필요한 일부만을 슬라이스해서 표시하는 방식
"더보기"나 "더 불러오기" 버튼을 사용하는 방식
사용자가 현재 결과를 보고 나서 명시적으로 추가 결과를 요청할 때만 서버에서 추가적인 결과를 로딩
무한 스크롤(더보기+JS동적구현)
사용자가 페이지를 끝까지 스크롤할 때마다 추가적인 결과를 동적으로 로딩하는 방식
사전 로딩
사용자가 다음 페이지로 이동하기 전에, 사용자가 클릭할 것으로 예상되는 링크 주변의 데이터를 미리 로딩하는 것이 목표
서버에서의 로직을 개선하는 방식
쿼리 최적화
검색 쿼리를 더 효율적으로 작성하거나 데이터베이스에서 더 빠르게 처리할 수 있도록 최적화하는 것이 목적. 이를 통해 빠른 검색 속도를 유지하면서도 서버 부하를 최소화
캐싱 활용(서버측)
검색 결과를 캐싱하여 동일한 검색에 대한 중복 요청을 피할 수 있음
→ 도서전체를 캐싱해봤는데
→ count 만이라도 캐싱해두면 빠르게 될 것 같다.
인덱싱 개선
검색 성능을 높이기 위해 데이터베이스의 인덱스를 최적화
사용자 경험 및 인터페이스 개선에 초점을 맞춘 방식(상호작용 최적화)
DB자체를 변경하는 기술스택도입
ElasticsearchSolr 같은 검색 엔진을 도입하면 검색 엔진은 대용량 데이터에서 빠르고 효율적인 검색을 지원하며, 다양한 기능과 유연성을 제공
클라이언트 측 캐싱(중요 정보는 제공하면 안됨)
서버에서 받은 데이터를 클라이언트 측에서 캐시하는 것을 의미. 이는 주로 브라우저의 로컬 스토리지나 메모리에 데이터를 저장하는 방식
비동기 로딩
페이지 이동이 아니라 비동기적으로 검색 결과를 로딩하는 방식을 도입kafka
캐싱
Redis 활용해보기.