카테고리 없음

Spring Data Elasticsearch 사용 예제

BEOKS 2022. 11. 9. 16:46

Table of contents

1. 들어가며

이번 포스트에서는 Spring Data Elasticsearch 를 가장 간단하게 사용하는 방법을 먼저 다루고
각 방법을 세부적으로 수정하는 방법과 Spring Data Elasticsearch 의 동작과정에 대해서 다루어 보겠습니다.

❕이 포스트는 Spring Data Elasticsearch 4.4.5 Reference Documentation 을 기준으로 작성되었습니다.

2. 간단한 사용방법

2.1 Elasticsearch 실행

Spring Data Elasticsearch 를 구성하기 전 연결할 Elasticsearch 를 실행하도록합니다.
버전 정보에 따르면 Spring Data Elasticsearch 4.4.5 버전을 위해선 Elasticsearch 7.17.6 버전을 설치해야합니다.
이미 설치되고 실행하고 있는 경우 이 과정을 생략해도 좋습니다.
Elasticsearch 는 설치 가이드를 통해서 여러 OS에 맞게 설치할 수 있습니다.
여기서는 도커를 이용해서 간단하게 실행해보겠습니다.

  1. Pull Docker Image
  2. docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6
  3. Create Elasticsearch Container
  4. docker run --name elastic --net elastic -p 9200:9200 -p 9300:9300 -e discovery.type=single-node -it docker.elastic.co/elasticsearch/elasticsearch:7.17.6

패스워드나 HTTPS 를 위한 인증서 설정 등 다양한 설정이 추가적으로 가능하지만, 여기서는 최소한의 사용방법을 익히는 것이 목표이므로
생략하도록 하겠습니다.

2.2 Spring Data Elasticsearch 종속성 추가

접속할 Elasticsearch 를 실행시켰으니 Spring Boot 프로젝트에서 Spring Data Elasticsearch 종속성을 추가합니다.

//...
dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.springframework.data:spring-data-elasticsearch:4.4.5")
    implementation("org.springframework.boot:spring-boot-starter-web")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}
//...

2.3 Spring Data Elasticsearch 연결 설정

스프링 프로젝트가 Elasticsearch 와 연결하기 위한 구성을 설정합니다. 여기에서 기본적인 호스트와 포트 비밀번호 그리고 SSL 설정 등 다양한 설정이 가능합니다.

package com.example.springdataelasticsearchdemo

import org.elasticsearch.client.RestHighLevelClient
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.elasticsearch.client.ClientConfiguration
import org.springframework.data.elasticsearch.client.RestClients
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories


@Configuration
@EnableElasticsearchRepositories(basePackages = ["com.example.springdataelasticsearchdemo.Student"])
class ElasticSearchConfig : AbstractElasticsearchConfiguration() {
    @Bean
    override fun elasticsearchClient(): RestHighLevelClient {
        val clientConfiguration: ClientConfiguration = ClientConfiguration.builder()
            .connectedTo("localhost:9200")
            .build()
        return RestClients.create(clientConfiguration).rest()
    }
}

2.3 테스트 클래스 생성

테스트를 위해서 간단한 학생 정보 클래스를 생성합니다.

package Student

import org.springframework.data.annotation.Id
import org.springframework.data.annotation.ReadOnlyProperty
import org.springframework.data.elasticsearch.annotations.Document
import java.time.LocalDate 

data class Person(
    val name:String="foo",
    val age: Int=10,
    val birthDate: LocalDate= LocalDate.now(),
)
@Document(indexName = "Student")
data class Student(
    @Id @ReadOnlyProperty
    val id:String,
    val personalInformation: Person=Person(),
    val department: String="Computer Science",
    val grade: Int=3
)

Document의 ID는 Elasticsearch 의 _id 와 연동됩니다.

2.4 테스트 레포지토리 생성

마지막으로 Spring Data Repository 인터페이스를 생성합니다. 다른 Spring Data 를 사용해보셨다면 아시겠지만 이 인터페이스를 참고하여 기본적인 쿼리를 요청할 수 있습니다.
여기까지가 Spring Data Elasticsearch 를 사용하기 위한 기본적인 구성입니다. 이 다음에는 Service 와 Controller 를 활용해서 학생 정보를 저장하는 HTTP API 를 만들어보겠습니다.

package com.example.springdataelasticsearchdemo.Student

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
import org.springframework.stereotype.Repository

@Repository
interface StudentRepository : ElasticsearchRepository<Student,String>{
}

2.5 Service 코드 생성

작성한 StudentRepository 를 이용해서 학생정보를 입력받아 저장하는 서비스 코드를 생성했습니다.

package com.example.springdataelasticsearchdemo.Student

import org.springframework.stereotype.Service

@Service
class StudentService(
    private val studentRepository: StudentRepository
) {
    fun save(student: Student){
        studentRepository.save(student)
    }
}

2.6 Controller 코드 생성

서비스 코드를 이용해서 학생 정보를 저장하는 POST API 를 생성했습니다.

package com.example.springdataelasticsearchdemo.Student

import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping

@Controller
@RequestMapping("/api/student")
class StudentController(
    private val studentService: StudentService
) {
    @PostMapping
    fun save(@RequestBody student: Student): ResponseEntity<String> {
        studentService.save(student)
        return ResponseEntity.ok("")
    }
}

2.7 HTTP API 테스트

이제 Postman 을 이용해서 테스트를 진행해보겠습니다. 아래와 같은 테스트 JSON 을 입력해서 POST 메서드로 요청을 전송합니다.

id의 경우 Elasticsearch 가 자동 생성하도록 하는 것이 좋습니다. 그러나 여기서는 조회 테스트를 편하게 하기 위해서 임의의 값을 입력했습니다.

 

전송을 성공했다면, Elasticsearch 에 직접 조회 API 를 전송해서 데이터를 확인해봅시다.

데이터가 잘 저장된 것을 확인할 수 있습니다. 다만 birthDate 의 경우 전송한 값과 다르게 저장되는데 이는 LocalDate 클래스를 사용하고 별다른 형식을 설정하지 않았기 때문입니다.
형식을 설정하는 방법은 아래에서 살펴보겠습니다.

2.8 마무리

지금까지 Spring Data Elasticsearch 를 가장 간단하게 사용하는 방법에 대해서 알아보았습니다. 이 과정에서 Elasticsearch 와 연결을 설정할 떄 비밀번호나 SSL 을 설정하는 법,
파일 저장 형식을 변경하는 법 등 자세한 세부사항과 동작과정에 대해서 궁금한 점이 생겼으리라 믿습니다. 이 방법들은 이 후의 포스트에서 더욱 자세히 알아보도록 하겠습니다.

3. 세부사항과 동작과정

세부사항과 동작과정은 하나의 포스트에 담기에 매우 방대하다고 생각하여 여러 포스트를 시리즈로 업로드할 예정입니다.

  1. Spring Data Elasticsearch Configuration 설정 - 작성중
  2. Spring Data Elasticsearch SSL/TLS 설정 - 예정
  3. Spring Data Elasticsearch Date 형식 설정 방법 - 예정
  4. Spring Data Elasticsearch Repository 의 동작 과정 이해하기 - 예정
  5. Custom Spring Data Elasticsearch Repository 생성하기 - 예정

Reference

  1. https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
  2. https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html