폴더 검색 기능 설계 문서(ElasticSearch)

반응형

kkrap 프로젝트에서 일주일 내 좋아요, 스크랩순 집계 기능과 특정 폴더를 검색해야하는 기능에 있어서 일반적인 SQL문 보다 좀 더 검색이 빠른 무언가를 해결하기 위한 과정이 필요했다 그 과정에 대해 기술한다.

기능 개요

우리 서비스에서 다음과 같은 기능을 만들게 되었는데 조회의 속도가 빠른 무언가 도구가 필요했다.

  • 폴더명, 설명, 작성자 → 검색어 입력시 검색
  • 최신순, 좋아요 순, 스크랩순 → 정렬된 결과 반환
  • 한달 내 좋아요 Top 10 → 집계
  • 팔로우한 사람들의 폴더만 보여주기 → 조건 검색

그래서 이걸 구현하기 위해 검색 엔진이라는 걸 발견하게 되어 도입해보려고 하였다.

 

기능 목적 및 배경

  • 왜 이 기능이 필요해졌는가?

기존 RDB 기반 LIKE 검색은 다음과 같은 문제점이 있었습니다:

  • 대량 데이터에서 다음과 같은 SQL문은 성능 저하
SELECT * FROM folders WHERE name LIKE '%맛집%'
  • 띄어쓰기/오타/복합 조건 검색이 어려움
  • 최신순, 좋아요순, 일주일 내 스크랩수 순 등 정렬·필터·집계 기능이 부족
  • 따라서 우리는 검색 엔진이 필요

원래는 그래프 DB를 이용해보려고 하였다.

그래프 DB는

  • 그래프 DB는 노드와 엣지로 데이터를 저장하고 관계를 빠르게 탐색하는 DB
  • 연결 관계 중심의 데이터 탐색에 강함

 

예시

“A → B → C” 관계 경로 탐색

“A 친구의 친구의 친구 추천”

“소셜 네트워크 그래프 탐색”

“추천 시스템의 네트워크 기반 접근”

 

우리 그래프 DB가 필요할까 생각을 좀 해보면 약간 팔로우 때문에 필요하다고 생각 할 것 같음

그런데 내 생각은 팔로우 폴더 조회보다는 정렬, 필터링, 검색이 훨씬 크다고 생각함

관계의 깊이도 생각해보면 내가 팔로우 한 사람의 그 사용자가 만든 폴더의 깊이만 생기기에 충분히 처리가 가능하다고 생각함

그래프 DB의 사용 용도는

  • 내 팔로우의 팔로우의 팔로우 폴더를 추천한다
  • 내가 좋아요 한 폴더를 좋아요 다른 사람의 폴더 추천
  • 내가 스크랩한 폴더에서 자주 같이 스크랩된 폴더를 추천

 

이거는 뭔가 추후에 추천까지 들어간다면 설계가 달라지지 않을까 싶다.

 

왜 elasticsearch 였냐?

  • 다음과 같이 검색 엔진은 다양하게 있다.

검색 엔진 장점 단점

Elasticsearch 오픈소스, 대중적, 커뮤니티 풍부 JVM 기반 → 메모리 관리 필요
Apache Solr 안정성, 기업용 많이 씀 설정 복잡, 트렌드 약해짐
Algolia 빠름, API 간단 유료 요금제, self-host 불가
MeiliSearch 가볍고 빠름 대규모 서비스 검증 부족
OpenSearch AWS 기반 Elasticsearch fork Elasticsearch만큼 생태계 크지 않음

 

이유는 다음과 같다.

 

1. 대규모 검색 처리 경험이 많은 검증된 오픈 소스

  • 구글, 넷플렉스, 우버, 인스타그램 등 실제 대기업 서비스들이 사용중

2. Full-Text ssearch(자연어 검색)에 강함

  • 형태소 분석기, 오타 및 유사어 검색 강력
  • 한국어 검색도 성능 이 좋다.

3. 필터, 정렬, 집계 기능 내장

→ 기본 query DSL로 filter/sort/aggregation 한 번에 처리 가능

{
  "query": { "match": { "folderName": "부산 맛집" }},
  "sort": [{ "createdAt": "desc" }],
  "size": 10
}

4. 빠른 응답 속도 + 확장성

5. Spring Data Elasticsearch로 Java 생태계에 통합 용이

 

설계 전략

  • ElasticSearch에서는 색인이라는 작업이 필요하다 그렇기에 DB와의 동기화 작업이 필수로 들어가야할 것 같아서 이 부분은 스케줄링으로 해결한다.
  • 색인된 데이터들은 데이터의 수정이나 생성이 일어날 경우에도 색인 작업을 같이 해준다.

상세 기능에 대해서는 다음 .md파일에서 상세하게 설명한다.

https://github.com/Kkrap-team/Backend/blob/feature/%2348/docs/feature-elasticsearch.md

 

Backend/docs/feature-elasticsearch.md at feature/#48 · Kkrap-team/Backend

[팀프로젝트 링크들을 나누고 모을 수 있는 링크 저장소. Contribute to Kkrap-team/Backend development by creating an account on GitHub.

github.com

 

반응형