스프링 Spring
31. ElasticSearch + Spring Data를 활용한 검색 서비스 구축
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. ElasticSearch란?
✔ ElasticSearch는 분산 검색 및 분석을 위한 오픈소스 검색 엔진
✔ JSON 기반의 RESTful API를 제공하며, 높은 성능과 확장성을 보장
📌 ElasticSearch의 주요 특징
| 빠른 검색 속도 | 인덱싱된 데이터를 기반으로 실시간 검색 가능 |
| 확장성(Scalability) | 클러스터를 구성하여 데이터 분산 처리 가능 |
| RESTful API 제공 | JSON 기반 API를 통해 손쉽게 데이터 검색 가능 |
| 분산 처리(Distributed Processing) | 노드를 추가하여 대용량 데이터 처리 가능 |
| 다양한 데이터 분석 지원 | Kibana와 연동하여 데이터 시각화 가능 |
📌 ElasticSearch를 활용하면 "대용량 데이터를 빠르게 검색하고 분석 가능"
2. ElasticSearch vs RDBMS 검색 비교
✔ 일반적인 RDBMS와 ElasticSearch의 검색 방식은 다름
📌 RDBMS vs ElasticSearch 비교
| 데이터 구조 | 테이블 기반 (정형 데이터) | JSON 기반 (비정형 데이터 포함) |
| 검색 속도 | 인덱스 기반 검색 (느림) | 역색인(Inverted Index) 기반 검색 (빠름) |
| 확장성 | 수직적 확장(Scale-Up) | 수평적 확장(Scale-Out) |
| 복잡한 쿼리 지원 | SQL 기반 복잡한 쿼리 가능 | 강력한 풀텍스트 검색 지원 |
📌 ElasticSearch는 "정형 및 비정형 데이터를 빠르게 검색할 때 적합"
✅ 여기까지 ElasticSearch의 개념과 RDBMS와의 차이를 배웠습니다!
👉 "그렇다면, Spring Boot에서 ElasticSearch를 어떻게 연동할까?"
✅ 2부에서 Spring Boot에서 ElasticSearch를 연동하고 활용하는 방법을 배워봅시다!
2. 상세 주제 정리
1. ElasticSearch 환경 설정
✔ Spring Boot에서 ElasticSearch를 사용하려면 의존성을 추가해야 함
📌 1️⃣ build.gradle에 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
}
✔ Spring Data ElasticSearch를 사용하여 쉽게 ElasticSearch와 연동 가능
📌 2️⃣ application.yml 설정
spring:
elasticsearch:
uris: http://localhost:9200
✔ ElasticSearch 서버와 연결하기 위한 기본 설정
📌 ElasticSearch를 활용하면 "Spring Boot 애플리케이션에서 강력한 검색 기능을 구현 가능"
2. ElasticSearch 엔티티 및 Repository 생성
✔ Spring Data ElasticSearch를 사용하여 엔티티 및 Repository를 생성 가능
📌 1️⃣ 문서(Document) 정의 (Product.java)
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "products")
public class Product {
@Id
private String id;
private String name;
private String description;
private double price;
// 기본 생성자 및 Getter, Setter
}
✔ @Document 어노테이션을 사용하여 ElasticSearch 인덱스 매핑
📌 2️⃣ Repository 생성 (ProductRepository.java)
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
List<Product> findByName(String name);
}
✔ ElasticsearchRepository를 확장하여 기본적인 CRUD 기능 제공
📌 ElasticSearch를 활용하면 "간단한 코드로 강력한 검색 기능을 제공 가능"
3. ElasticSearch 검색 기능 구현
✔ Spring Boot에서 ElasticSearch를 활용하여 다양한 검색 기능 구현 가능
📌 1️⃣ 검색 기능 구현 (ProductService.java)
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
private final ProductRepository productRepository;
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public List<Product> searchByName(String name) {
return productRepository.findByName(name);
}
}
✔ findByName()을 활용하여 특정 키워드를 포함하는 데이터를 검색 가능
📌 2️⃣ 검색 API 구현 (ProductController.java)
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/products")
public class ProductController {
private final ProductService productService;
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping("/search")
public List<Product> search(@RequestParam String name) {
return productService.searchByName(name);
}
}
✔ REST API를 통해 ElasticSearch에서 데이터를 검색 가능
📌 ElasticSearch를 활용하면 "빠르고 효율적인 검색 기능을 쉽게 구현 가능"
4. ElasticSearch에서 복잡한 검색 기능 적용
✔ 다양한 검색 조건을 적용하여 보다 정교한 검색 구현 가능
📌 ElasticSearch의 QueryDSL을 활용한 검색 (ProductRepository.java)
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Repository;
import java.util.List;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
@Repository
public class ProductCustomRepository {
private final ElasticsearchOperations elasticsearchOperations;
public ProductCustomRepository(ElasticsearchOperations elasticsearchOperations) {
this.elasticsearchOperations = elasticsearchOperations;
}
public List<Product> searchByDescription(String keyword) {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("description", keyword))
.build();
return elasticsearchOperations.search(searchQuery, Product.class)
.stream()
.map(hit -> hit.getContent())
.toList();
}
}
✔ QueryDSL을 사용하여 특정 필드(description)에서 키워드 검색 가능
📌 ElasticSearch를 활용하면 "자연어 처리 기반 검색 및 복잡한 조건 검색이 가능"
✅ 여기까지 Spring Boot에서 ElasticSearch를 활용한 검색 서비스 구축 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 OpenTelemetry를 활용한 애플리케이션 모니터링은 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 OpenTelemetry를 활용한 애플리케이션 모니터링 기법을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
| Spring 기초 <35. Spring에서 커스텀 애너테이션(Custom Annotation) 만들기> (1) | 2025.04.20 |
|---|---|
| Spring 기초 <34. Spring Boot 실무 Best Practices 및 최신 트렌드 (Reactive Programming, Cloud Native)> (1) | 2025.04.19 |
| Spring 기초 <33. Spring Boot에서 A/B 테스트와 Feature Toggle 적용> (0) | 2025.04.18 |
| Spring 기초 <32. Spring Boot에서 OpenTelemetry를 활용한 애플리케이션 모니터링> (0) | 2025.04.17 |
| Spring 기초 <30. Spring Cloud Gateway vs API Gateway 차이> (0) | 2025.04.16 |
| Spring 기초 <29. Spring Cloud 기반 MSA(Microservices) 아키텍처 설계> (0) | 2025.04.15 |
| Spring 기초 <28. Spring Boot와 Kubernetes를 활용한 클라우드 배포 전략> (0) | 2025.04.14 |
| Spring 기초 <27. Spring Boot에서 트랜잭션 관리 최적화 (@Transactional, REQUIRES_NEW)> (1) | 2025.04.13 |