본문 바로가기

Study Information Technology

Spring Boot와 Elasticsearch 통합 강력한 전체 텍스트 검색 기능 구현하기

728x90
반응형

Spring Boot와 Elasticsearch 통합: 강력한 전체 텍스트 검색 기능 구현하기

Overview

Spring Boot와 Elasticsearch의 통합은 애플리케이션 내에서 강력한 전체 텍스트 검색 기능을 구현할 수 있는 방법을 제공합니다. Elasticsearch는 분산형 검색 엔진으로, 대량의 데이터를 실시간으로 검색하고 분석할 수 있도록 설계되었습니다. 이를 Spring Boot와 결합하면 데이터 검색 기능이 극대화되며, 복잡한 쿼리나 필터링 작업이 수월해집니다. 이번 포스팅에서는 Spring Boot와 Elasticsearch를 통합하는 방법을 단계별로 자세히 설명하고, 코드 예제와 함께 일반적인 에러 메시지와 해결 방법도 다루겠습니다.

1. Spring Boot 프로젝트 설정

먼저 Spring Boot 프로젝트를 설정해야 합니다. Spring Initializr를 사용하여 새로운 프로젝트를 생성할 수 있습니다. 필요한 의존성으로는 Spring Web, Spring Data Elasticsearch, Lombok 등을 선택합니다.

1.1. Maven 의존성 추가

프로젝트의 pom.xml 파일에 Elasticsearch 의존성을 추가합니다.

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

1.2. Elasticsearch 설정

application.properties 또는 application.yml 파일에 Elasticsearch 서버의 주소를 설정합니다.

spring.elasticsearch.rest.uris=http://localhost:9200

이제 Elasticsearch 서버가 로컬에서 실행되고 있어야 합니다. Elasticsearch 설치 가이드를 참고해 설치할 수 있습니다.

2. 도메인 모델 정의

Elasticsearch에서 검색할 데이터를 나타내는 도메인 모델을 정의합니다. 예를 들어, 블로그 포스트를 검색할 수 있는 Post 클래스를 만들어 보겠습니다.

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "posts")
public class Post {
@Id
private String id;
private String title;
private String content;

// 생성자, getter, setter
}

2.1. Annotations

  • @Document: 해당 클래스가 Elasticsearch에서 사용할 인덱스를 정의합니다. indexName 속성을 통해 인덱스 이름을 설정합니다.
  • @Id: 해당 필드가 고유 식별자임을 나타냅니다.

3. Elasticsearch Repository 생성

Spring Data Elasticsearch를 사용하여 CRUD 작업을 위한 Repository 인터페이스를 생성합니다.

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

public interface PostRepository extends ElasticsearchRepository<Post, String> {
List<Post> findByTitleContaining(String title);
}

이제 PostRepository를 사용하여 Post 객체에 대한 CRUD 작업 및 특정 쿼리 메서드를 호출할 수 있습니다.

4. 서비스 계층 구현

비즈니스 로직을 처리하기 위한 서비스 클래스를 구현합니다.

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

import java.util.List;

@Service
public class PostService {

private final PostRepository postRepository;

@Autowired
public PostService(PostRepository postRepository) {
this.postRepository = postRepository;
}

public Post savePost(Post post) {
return postRepository.save(post);
}

public List<Post> searchByTitle(String title) {
return postRepository.findByTitleContaining(title);
}
}

5. 컨트롤러 구현

RESTful API를 제공하기 위한 컨트롤러 클래스를 생성합니다.

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

import java.util.List;

@RestController
@RequestMapping("/api/posts")
public class PostController {

private final PostService postService;

@Autowired
public PostController(PostService postService) {
this.postService = postService;
}

@PostMapping
public Post createPost(@RequestBody Post post) {
return postService.savePost(post);
}

@GetMapping("/search")
public List<Post> searchPosts(@RequestParam String title) {
return postService.searchByTitle(title);
}
}

6. 예외 처리 및 에러 관리

Elasticsearch와 통합할 때 발생할 수 있는 일반적인 에러를 처리하는 방법을 알아보겠습니다.

6.1. 에러 메시지

  1. IndexNotFoundException: 지정된 인덱스가 존재하지 않을 때 발생합니다.
  • 해결 방법: 해당 인덱스를 생성하거나 올바른 인덱스 이름을 사용했는지 확인합니다.
  1. ElasticsearchException: Elasticsearch에서 쿼리 실행 중 문제가 발생할 때 발생합니다.
  • 해결 방법: 쿼리를 검토하고 문법 오류가 없는지 확인합니다.

6.2. 예외 처리

Spring Boot에서 글로벌 예외 처리를 위해 @ControllerAdvice를 사용할 수 있습니다.

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(IndexNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleIndexNotFound(IndexNotFoundException ex) {
return ex.getMessage();
}

@ExceptionHandler(ElasticsearchException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleElasticsearchException(ElasticsearchException ex) {
return ex.getMessage();
}
}

7. 테스트 및 검증

애플리케이션이 정상적으로 작동하는지 테스트합니다. Postman과 같은 API 테스트 도구를 사용하여 POST 및 GET 요청을 시도할 수 있습니다.

7.1. 데이터 삽입 테스트

POST /api/posts
{
"title": "Elasticsearch Tutorial",
"content": "Learn how to integrate Elasticsearch with Spring Boot."
}

7.2. 검색 테스트

GET /api/posts/search?title=Elasticsearch

참고 문서

위와 같이 Spring Boot와 Elasticsearch를 통합하면 강력한 검색 기능을 제공할 수 있습니다. 데이터의 양이 많아질수록 Elasticsearch의 성능을 체감할 수 있으며, 다양한 쿼리로 사용자의 요구를 만족시킬 수 있습니다.

반응형