엘라스틱 서치에 접근해서 데이터를 조회하는 방법은 크게 2가지가 있다.
Repository 방식과 Request(Client API) 방식이 존재한다.
Repository는 Spring Data ElasticSearch에서 제공하는 JPA 스타일의 Repository 방식
- ElasticsearchRepository 또는 ElasticsearchCrudRepository를 상속받아 간단한 CRUD 기능을 제공해 준다. 쿼리를 직접 작성하지 않아도 메서드 네이밍 규칙에 따라 자동으로 생성한다.
Request
RestHighLevelClient(Java API) 또는 직접 HTTP 요청을 보내는 방식(Elasticsearch API)을 사용하여 Elasticsearch를 제어한다.
- JSON DSL을 직접 사용하여 보다 정교한 검색 및 조작을 수행할 수 있다.
결론적으로 Repository는 일반적인 CRUD에서 사용하기 용이하게 디자인 되어 있고, Request는 고급 기능 검색, 예를 들어 집계나 필터를 적용한 검색에 특화되어 있다.
실상 현재 프로젝트에서도 이 기준을 가지고 코드가 상황에 맞게 구현이 되어있다. 기술적 의사 결정이라고는 하지만, 실제적으로는 상황에 맞게 2개를 다 사용했다.
아래는 상세 내용이다.
1. Repository 방식 (Spring Data Elasticsearch)
설명
- Spring Data Elasticsearch를 활용하여 JPA처럼 Elasticsearch 데이터를 다룰 수 있는 방식.
- 인터페이스 기반으로 ElasticsearchRepository 또는 ElasticsearchCrudRepository를 상속받아 간단한 CRUD 기능을 제공.
- 쿼리를 직접 작성하지 않아도 메서드 네이밍 규칙에 따라 자동으로 생성됨.
장점
✅ 코드가 간결함: JPA와 유사한 방식으로 CRUD 작업을 간단하게 수행 가능.
✅ 빠른 개발 가능: 복잡한 설정 없이 Repository 인터페이스만 정의하면 기본적인 CRUD 기능을 쉽게 사용할 수 있음.
✅ Spring Boot와 통합 용이: Spring의 DI(Dependency Injection)와 연동하여 편리하게 사용 가능.
✅ 자동 매핑 지원: 엔티티와 Elasticsearch 문서 간 자동 매핑 지원.
단점
❌ 복잡한 쿼리 작성이 어려움: 네이티브 쿼리를 지원하지만, 고도화된 검색 기능을 활용하려면 QueryDSL 또는 커스텀 리포지토리를 사용해야 함.
❌ 실행 속도 저하 가능성: 내부적으로 Reflection 및 Proxy를 사용하므로 직접 API를 호출하는 방식보다 성능이 낮을 수 있음.
❌ Elasticsearch의 최신 기능 반영이 늦음: Spring Data Elasticsearch 버전이 Elasticsearch 최신 버전을 지원하지 않을 수 있음.
언제 사용해야 하는가?
✔ CRUD 기능이 대부분이고, 복잡한 검색이 필요하지 않은 경우.
✔ 빠르게 Elasticsearch 연동을 구축해야 하는 경우.
✔ Spring Boot 환경에서 다른 Spring Data와 함께 통합적으로 사용할 경우.
언제 사용하면 안 되는가?
🚫 대량의 데이터를 빠르게 처리해야 할 경우 (Batch 처리).
🚫 고급 검색 기능(예: Aggregation, Multi-Search 등)이 필요한 경우.
🚫 Elasticsearch의 최신 기능(예: Runtime Fields, New Scripting API 등)을 즉시 활용해야 하는 경우.
2. Request(Client API) 방식 (RestHighLevelClient, Elasticsearch API)
설명
- RestHighLevelClient(Java API) 또는 직접 HTTP 요청을 보내는 방식(Elasticsearch API)을 사용하여 Elasticsearch를 제어.
- JSON DSL을 직접 사용하여 보다 정교한 검색 및 조작 가능.
장점
✅ 유연한 쿼리 작성: Elasticsearch의 강력한 Query DSL을 직접 활용할 수 있음.
✅ 고급 검색 기능 지원: Aggregation, Nested Query, Multi-Search 등 복잡한 검색 기능을 사용할 수 있음.
✅ 최신 Elasticsearch 기능 활용 가능: Elasticsearch 버전과 관계없이 모든 API를 직접 호출 가능.
✅ 높은 성능: 직접 API를 호출하므로 Spring Data Elasticsearch의 Overhead가 없음.
단점
❌ 코드가 복잡해질 수 있음: JSON 기반의 Query DSL을 직접 작성해야 하므로 가독성이 떨어질 수 있음.
❌ Spring Boot와 통합성이 낮음: RestHighLevelClient는 Spring의 Repository 방식처럼 자동 매핑이 되지 않음.
❌ 직접 데이터 매핑 필요: Elasticsearch에서 가져온 데이터를 직접 DTO나 Entity로 변환해야 함.
언제 사용해야 하는가?
✔ 복잡한 검색 로직이 필요한 경우 (예: Aggregation, Full-text Search, Multi-Search).
✔ 대량의 데이터 처리 (Batch Insert, Bulk Processing 등).
✔ Elasticsearch 최신 기능을 즉시 활용해야 하는 경우.
언제 사용하면 안 되는가?
🚫 단순한 CRUD 위주의 서비스에서 불필요하게 복잡성을 증가시키는 경우.
🚫 Spring Boot 기반 프로젝트에서 JPA 스타일의 간단한 연동이 필요한 경우.
🚫 Elasticsearch와의 연동이 적고, 관리할 코드의 복잡성을 줄이고 싶을 경우.
3. Repository 방식 vs Request(Client API) 방식 차이점 정리
비교 항목 Repository 방식 (Spring Data Elasticsearch) Request(Client API) 방식 (RestHighLevelClient, Elasticsearch API)
개발 편의성 |
✅ 간편한 CRUD 제공 |
❌ 직접 Query DSL 작성 필요 |
복잡한 쿼리 지원 |
❌ 제한적 (QueryDSL 또는 커스텀 필요) |
✅ 완전한 Query DSL 지원 |
성능 |
❌ Proxy 및 Reflection으로 인해 느릴 수 있음 |
✅ 직접 API 호출로 최적화 가능 |
Spring Boot 통합 |
✅ Spring Data 방식 지원 |
❌ 직접 설정 필요 |
최신 기능 지원 |
❌ Spring Data 버전 의존 |
✅ 최신 API 즉시 활용 가능 |
대량 데이터 처리 |
❌ 적합하지 않음 |
✅ Bulk API 지원 |
4. 결론: 언제 어떤 방식을 선택해야 하는가?
✅ Repository 방식(Spring Data Elasticsearch) 추천 경우
- 기본적인 CRUD 작업이 대부분인 경우.
- Spring Boot 프로젝트에서 빠르고 간편하게 Elasticsearch를 연동하고 싶은 경우.
- 데이터 검색이 단순하고, 최신 Elasticsearch 기능을 활용할 필요가 없는 경우.
✅ Request(Client API) 방식 추천 경우
- 복잡한 검색이 필요한 경우(Aggregation, Multi-Search, Nested Query 등).
- 대량의 데이터를 빠르게 처리해야 하는 경우(Bulk Processing, High Throughput 요구).
- Elasticsearch 최신 기능을 즉시 활용해야 하는 경우.
5. 결론 요약
- 간단한 CRUD, 빠른 개발 → Spring Data Elasticsearch (Repository 방식)
- 고급 검색, 대량 데이터 처리 → Request(Client API) 방식
- 둘을 혼합해서 사용 가능 → 기본 CRUD는 Repository 방식, 복잡한 쿼리는 Client API 방식