본문 바로가기

Study Information Technology

Spring Boot와 Elasticsearch 통합하기

728x90
반응형

Spring Boot와 Elasticsearch 통합하기

Overview

Spring Boot와 Elasticsearch를 통합하는 것은 데이터의 검색 및 분석을 효율적으로 처리할 수 있는 강력한 방법입니다. Elasticsearch는 분산형 검색 및 분석 엔진으로, 대량의 데이터를 실시간으로 검색하고 분석하는 데 매우 유용합니다. Spring Boot는 Java 기반의 프레임워크로, 애플리케이션 개발을 신속하고 간편하게 만들어줍니다. 이 두 기술을 함께 사용하면 고성능의 검색 기능을 갖춘 애플리케이션을 만들 수 있습니다.

이번 글에서는 Spring Boot 애플리케이션에서 Elasticsearch를 설정하고 사용하는 방법에 대해 자세히 설명하겠습니다. 각 단계에서 발생할 수 있는 에러와 그 해결 방법도 함께 다루겠습니다.


1. Spring Boot 프로젝트 설정

1.1. 프로젝트 생성

Spring Boot 애플리케이션을 시작하려면 Spring Initializr를 사용하여 새로운 프로젝트를 생성할 수 있습니다. Spring Initializr는 https://start.spring.io에서 제공되며, 필요한 종속성과 프로젝트 설정을 선택할 수 있습니다.

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 최신 버전
  • Group: com.example
  • Artifact: elasticsearchdemo
  • Dependencies: Spring Web, Spring Data Elasticsearch

이 설정으로 프로젝트를 생성하면, 기본적인 Spring Boot 애플리케이션이 준비됩니다.

1.2. 의존성 추가

pom.xml 파일에 Elasticsearch 관련 의존성을 추가해야 합니다. Spring Boot의 Elasticsearch 스타터 의존성을 사용하면 Elasticsearch와의 통합이 간편해집니다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>
  <!-- Other dependencies -->
</dependencies>

1.3. Elasticsearch 설정

application.properties 또는 application.yml 파일에 Elasticsearch 서버의 호스트와 포트를 설정합니다. 기본적으로 Elasticsearch는 localhost:9200에서 실행됩니다. 설정 파일에 아래와 같은 내용을 추가합니다.

application.properties

spring.elasticsearch.uris=http://localhost:9200
spring.data.elasticsearch.repositories.enabled=true

application.yml

spring:
elasticsearch:
uris: http://localhost:9200
data:
elasticsearch:
repositories:
enabled: true

Elasticsearch 서버가 로컬에서 실행 중이지 않다면, Docker를 사용하여 Elasticsearch를 실행할 수 있습니다. 아래의 명령어를 사용하여 Docker에서 Elasticsearch를 실행할 수 있습니다.

docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.0.0

2. Elasticsearch와의 연동

2.1. 도메인 모델 정의

Elasticsearch와의 상호작용을 위해 도메인 모델을 정의해야 합니다. 예를 들어, Product라는 엔티티를 정의할 수 있습니다. 이 엔티티는 Elasticsearch에서 검색할 수 있는 데이터를 담고 있습니다.

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchDocument;

@ElasticsearchDocument(indexName = "products")
public class Product {

@Id
private String id;
private String name;
private double price;

// getters and setters
}

2.2. Repository 인터페이스 정의

Spring Data Elasticsearch를 사용하여 Elasticsearch에 대한 CRUD 작업을 수행할 수 있는 Repository 인터페이스를 정의합니다.

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface ProductRepository extends ElasticsearchRepository<Product, String> {

// Custom query methods can be defined here
}

2.3. 서비스 클래스 작성

서비스 클래스를 작성하여 Elasticsearch에 데이터를 저장하고 검색할 수 있는 메서드를 제공합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

@Autowired
private ProductRepository productRepository;

public Product saveProduct(Product product) {
return productRepository.save(product);
}

public Iterable<Product> getAllProducts() {
return productRepository.findAll();
}

public Product getProductById(String id) {
return productRepository.findById(id).orElse(null);
}

public void deleteProduct(String id) {
productRepository.deleteById(id);
}
}

2.4. 컨트롤러 클래스 작성

웹 애플리케이션의 경우, 컨트롤러를 작성하여 HTTP 요청을 처리하고 서비스 클래스를 호출합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/products")
public class ProductController {

@Autowired
private ProductService productService;

@PostMapping
public Product createProduct(@RequestBody Product product) {
return productService.saveProduct(product);
}

@GetMapping
public Iterable<Product> getAllProducts() {
return productService.getAllProducts();
}

@GetMapping("/{id}")
public Product getProductById(@PathVariable String id) {
return productService.getProductById(id);
}

@DeleteMapping("/{id}")
public void deleteProduct(@PathVariable String id) {
productService.deleteProduct(id);
}
}

3. 에러 처리 및 해결 방법

3.1. Elasticsearch 연결 에러

에러 코드: ElasticsearchTransportException

해결 방법: Elasticsearch 서버가 실행 중인지 확인하고, application.properties 파일의 spring.elasticsearch.uris 설정이 올바른지 점검합니다. Elasticsearch가 실행되지 않거나 설정이 잘못된 경우, 연결 에러가 발생할 수 있습니다.

3.2. IndexNotFoundException

에러 코드: IndexNotFoundException

해결 방법: Elasticsearch에서 지정한 인덱스가 없을 때 발생하는 에러입니다. 도메인 모델의 @ElasticsearchDocument 어노테이션에서 indexName 속성이 올바르게 설정되었는지 확인하고, Elasticsearch 서버에서 해당 인덱스가 존재하는지 확인합니다.

3.3. 데이터 타입 문제

에러 코드: MapperParsingException

해결 방법: Elasticsearch 문서의 필드 타입이 정의된 도메인 모델의 필드 타입과 일치하지 않을 때 발생합니다. 데이터 타입이 정확히 일치하도록 도메인 모델을 수정하거나 Elasticsearch 매핑을 조정합니다.

참고문서

이러한 과정을 통해 Spring Boot 애플리케이션과 Elasticsearch를 효과적으로 통합하여 데이터 검색 및 분석 기능을 강화할 수 있습니다. 각 단계에서 발생할 수 있는 문제를 이해하고 적절한 해결 방법을 적용하면, 더욱 안정적이고 효율적인 검색 기능을 구현할 수 있습니다.

728x90
반응형