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
'프로젝트 > kkrap' 카테고리의 다른 글
| 메인페이지 무한 스크롤 기능 (1) | 2025.07.30 |
|---|---|
| 커서 기반 페이지네이션이란? (1) | 2025.07.30 |
| ElasticSearch란? (2) | 2025.07.29 |
| 검색 엔진이란? (0) | 2025.07.29 |
| URL 메타데이터 추출 기능 개선 문서 - (EC2 대응) (5) | 2025.07.28 |