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에 맞게 설치할 수 있습니다.
여기서는 도커를 이용해서 간단하게 실행해보겠습니다.
- Pull Docker Image
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6
- Create Elasticsearch Container
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. 세부사항과 동작과정
세부사항과 동작과정은 하나의 포스트에 담기에 매우 방대하다고 생각하여 여러 포스트를 시리즈로 업로드할 예정입니다.
- Spring Data Elasticsearch Configuration 설정 - 작성중
- Spring Data Elasticsearch SSL/TLS 설정 - 예정
- Spring Data Elasticsearch Date 형식 설정 방법 - 예정
- Spring Data Elasticsearch Repository 의 동작 과정 이해하기 - 예정
- Custom Spring Data Elasticsearch Repository 생성하기 - 예정