IT Developer/Spring

Spring 기초 <31. ElasticSearch + Spring Data를 활용한 검색 서비스 구축>

TEMA_ 2025. 4. 16. 13:35
반응형

스프링 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 비교

비교 항목RDBMS (MySQL, PostgreSQL)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를 활용한 애플리케이션 모니터링 기법을 배워봅시다!

 

반응형