버전 정보

이 가이드는 다음 버전을 기준으로 작성되었습니다:

  • Elasticsearch: 8.11.x
  • Kibana: 8.11.x
  • Spring Boot: 3.2.x
  • Spring Data Elasticsearch: 5.2.x
  • Java: 17+

다른 버전에서는 일부 API나 설정이 다를 수 있습니다. 특히 Elasticsearch 7.x와 8.x는 보안 설정, 클라이언트 API 등에서 큰 차이가 있습니다.

Elasticsearch란?#

Elasticsearch는 분산 검색 및 분석 엔진입니다. 대용량 데이터에서 빠르게 검색하고, 실시간으로 분석할 수 있게 해주는 도구입니다.

왜 Elasticsearch가 필요한가?#

RDB의 LIKE '%검색어%'로 검색하면 어떤 문제가 생길까요?

RDB 검색의 한계Elasticsearch 도입 후
풀 테이블 스캔으로 느림역색인(Inverted Index)으로 밀리초 검색
형태소 분석 불가“삼성전자” 검색 시 “삼성”, “전자” 모두 매칭
오타 허용 안 됨Fuzzy 검색으로 “삼섬전자"도 찾음
연관도 정렬 불가검색 관련성 점수로 정확한 결과 상위 노출
단일 서버 한계샤딩으로 수평 확장, 수십억 건 처리

Elasticsearch는 이런 문제들을 해결하면서도 실시간 검색, 복잡한 집계, 고가용성을 제공합니다.

언제 Elasticsearch를 써야 할까?#

적합한 경우:

  • 상품, 게시글 등 풀텍스트 검색이 필요할 때
  • 로그, 메트릭 등 시계열 데이터 분석이 필요할 때
  • 대시보드용 실시간 집계가 필요할 때
  • 자동완성, 오타 교정, 동의어 처리가 필요할 때
  • 데이터가 많아 RDB 검색이 느려졌을 때

과할 수 있는 경우:

  • 단순 CRUD만 필요할 때 (RDB로 충분)
  • 트랜잭션 무결성이 중요할 때 (Elasticsearch는 Eventually Consistent)
  • 데이터가 적고 검색 요구사항이 단순할 때
  • 운영 인프라를 갖출 여력이 없을 때

Elasticsearch의 한계와 주의점#

Elasticsearch를 도입하기 전에 알아야 할 현실적인 단점입니다:

한계설명대응 방안
운영 복잡도클러스터 관리, 샤드 리밸런싱, JVM 튜닝 필요전담 인력 또는 관리형 서비스 고려
비용메모리 집약적, 노드당 최소 4GB+ 권장데이터 규모에 맞는 용량 산정
데이터 일관성Eventually Consistent, 실시간 반영 아님 (기본 1초 refresh)실시간성이 중요하면 refresh 설정 조정
스키마 변경기존 필드 타입 변경 불가, 재인덱싱 필요초기 Mapping 설계 중요
JOIN 미지원테이블 간 JOIN 불가능, 비정규화 필수데이터 모델 재설계, Application-side JOIN
트랜잭션 미지원ACID 트랜잭션 없음RDB를 Primary로, ES는 검색용으로 분리
학습 곡선Query DSL, Mapping, 분석기 등 학습 필요팀 역량 고려

실무 조언: Elasticsearch는 “검색 전용 보조 저장소"로 사용하고, RDB를 메인 저장소로 유지하는 패턴이 가장 안전합니다. ES 장애 시에도 서비스 핵심 기능은 유지됩니다.

대안 기술 비교#

Elasticsearch만이 유일한 선택지는 아닙니다:

기술특징적합한 경우
Elasticsearch풀스택 검색/분석, 가장 많은 기능대규모 검색, 로그 분석, 복잡한 집계
OpenSearchES 7.10 포크, AWS 관리형 제공AWS 환경, 라이선스 우려 시
Apache Solr오래된 역사, 안정성 검증전통적 엔터프라이즈 환경
Meilisearch설정 간소, 빠른 시작소규모, 프로토타입, 타이핑 실시간 검색
Typesense쉬운 설정, 오타 허용 기본 내장소규모 서비스, 빠른 구현 필요
PostgreSQL FTS별도 시스템 불필요단순 검색, 이미 PG 사용 중

선택 기준: 데이터 규모 < 100만 건, 검색 요구사항이 단순하면 PostgreSQL FTS나 Meilisearch로 충분합니다. Elasticsearch는 대규모, 복잡한 요구사항에 적합합니다.

RDB vs Elasticsearch#

개념RDBElasticsearch
저장 단위RowDocument (JSON)
스키마Table SchemaMapping
테이블TableIndex
컬럼ColumnField
인덱스B-Tree IndexInverted Index
조인JOINNested, Parent-Child (제한적)
트랜잭션ACIDEventually Consistent

핵심 차이: RDB는 정규화된 데이터의 정확한 조회에, Elasticsearch는 비정규화된 데이터의 빠른 검색에 최적화되어 있습니다.

이 가이드에서 다루는 것#

Quick Start#

5분 만에 Elasticsearch에 데이터를 넣고 검색해봅니다. 개념보다 먼저 동작하는 것을 확인하세요.

개념 이해#

단순히 “이렇게 쓰세요"가 아닌, 왜 이렇게 동작하는지 원리를 설명합니다.

주제배우는 것
핵심 구성요소Cluster, Node, Index, Document, Shard의 역할과 관계
데이터 모델링Mapping, Field Type, Analyzer 설계
Query DSLMatch, Term, Bool 등 검색 쿼리 작성법
검색 관련성Score, BM25, Boosting으로 검색 품질 높이기
집계Bucket, Metric 집계로 데이터 분석하기
인덱싱 전략Bulk 인덱싱, Refresh, ILM 설정
클러스터 관리노드 구성, 샤드 할당, 상태 모니터링
성능 튜닝쿼리 최적화, 캐싱, JVM 설정
고가용성Replica, Snapshot, 장애 대응

실습 예제#

Spring Boot 기반의 실행 가능한 예제 코드입니다.

How-To Guide#

특정 문제를 해결하기 위한 단계별 가이드입니다:

부록#

선수 지식#

  • 필수: REST API 기본, JSON 형식 이해
  • 도움됨: Java/Spring Boot 경험, RDB 사용 경험

학습 경로 제안#

처음이라면:     Quick Start → 핵심 구성요소 → 데이터 모델링 → 기본 예제
검색 구현:      Query DSL → 검색 관련성 → 상품 검색 시스템
데이터 분석:    집계 → 인덱싱 전략
운영 준비:      클러스터 관리 → 성능 튜닝 → 고가용성

각 문서는 독립적으로 읽을 수 있지만, 처음이라면 위 순서를 추천합니다.