- 도입을 희망하는 기술
<aside>
Elasticsearch - 분산형 검색 및 분석 엔진
</aside>
- 기술 설명
<aside>
Elasticsearch는 Apache Lucene을 기반으로 하는 분산형 실시간 검색 및 분석 엔진이다.
프로젝트에서 통계 분석 조회 전용 데이터베이스로 활용하여, PostgreSQL 메인 데이터베이스와는 별개로 복잡하고 다양한 통계 조회 요청을 신속하게 처리하는 분석 전용 Query 모델의 역할을 담당한다.
</aside>
- 기술 장점
<aside>
- 다차원 실시간 집계 및 분석: Elasticsearch의 다차원 데이터를 실시간으로 집계하고 분석이 가능하다.
- PostgreSQL에서 사용자의 인구통계학적 정보와 설문 응답을 결합하는 교차 분석은 복잡한
JOIN과 GROUP BY를 요구하여 성능 저하가 발생한다.
- MongoDB의 Aggregation Pipeline에 비해, Elasticsearch는 여러 조건을 즉석에서 조합하고 탐색하는 비정형적(Ad-hoc) 분석 쿼리에 더욱 최적화되어 있어, 마치 API로 피벗 테이블을 다루듯 유연한 통계 추출이 가능하다.
- 강력한 텍스트 분석 기능: Elasticsearch는 검색 엔진으로서 텍스트 데이터 분석이 가능하다.
- PostgreSQL이나 MongoDB는 텍스트를 저장할 뿐, 그 의미를 분석하지 못한다. 서술형 응답의 키워드 빈도수를 분석하려면 데이터를 외부로 추출해 별도의 자연어 처리(NLP) 파이프라인을 구축해야 한다.
- 반면, Elasticsearch는 형태소 분석기를 통한 토큰화(Tokenization)와
Terms Aggregation을 통해 단일 쿼리만으로 텍스트의 핵심 키워드와 빈도수를 추출할 수 있다.
- 뛰어난 검색 성능 및 수평적 확장성: 역색인 구조를 기반으로 하여 비정형 데이터를 포함한 대용량 데이터에 대해 빠른 검색 및 집계 성능을 보장한다. 또한, 샤딩(Sharding)을 통해 데이터를 여러 서버에 분산하여 저장함으로써, 통계 분석 데이터가 증가해도 안정적인 성능을 유지할 수 있습니다.
</aside>
- 단점 / 한계점 / 주의사항
<aside>
- 데이터 일관성: Elasticsearch는 엄격한 ACID 트랜잭션을 지원하기보다 거의 실시간(Near Real-Time)의 결과적 일관성 모델으 따른다. 하지만 통계/분석용 Query 모델로 사용되므로, 수 초 이내의 데이터 지연은 무방하다.
- 높은 메모리 사용량: 빠른 검색을 위해 인덱스와 캐시 데이터를 메모리에 상주시키므로, 상대적으로 높은 메모리 사양이 요구되어 인프라 비용이 증가할 수 있다.
- 데이터 동기화 로직 구현: PostgreSQL의 원본 데이터가 변경될 때마다 Elasticsearch의 분석용 문서를 업데이트하는 안정적인 동기화 파이프라인(이벤트 기반 아키텍처 등)을 별도로 구축해야 한다.
</aside>
- 도입 배경과 필요성
<aside>
현재 PostgreSQL 중심의 아키텍처는 단순 조회를 넘어선 복잡한 통계 분석 요구사항을 충족시키기에 기능적, 성능적 한계가 존재한다. 특히, 교차 분석과 텍스트 분석 기능은 현 구조로는 구현이 매우 어렵다.
- 고급 통계 분석 기능 구현: '20대 여성의 제품 선호도'와 같은 다차원 교차 분석과 서술형 응답의 핵심 키워드 추출 등, 비즈니스 인사이트를 제공할 핵심적인 분석 기능을 구현하기 위해 Elasticsearch 가 필요하다.
- 메인 DB 부하 분산 및 시스템 안정성 확보: 복잡하고 무거운 분석 쿼리를 Elasticsearch로 완전히 분리함으로써, 트랜잭션을 처리하는 메인 PostgreSQL DB의 부하를 줄여 시스템 전체의 안정성과 성능을 향상시킨다.
- CQRS 패턴의 완성: 데이터 변경은 PostgreSQL(Command), 복잡한 데이터 분석 및 조회는 Elasticsearch(Query)로 역할을 완벽히 분리하여, 유지보수성과 확장성이 뛰어난 아키텍처를 완성할 수 있다.
- 실시간 분석 환경으로의 전환: 주기적인 배치 작업으로 통계를 생성하는 현재 방식에서 벗어나, 데이터 발생 즉시 분석이 가능한 실시간 분석 환경을 구축하여 사용자에게 항상 최신화된 통계를 제공할 수 있다.
</aside>