728x90
설정
버전이 굉장히 중요하다.
elasticsearch 버전 별로 deprecated 되는 주요 기능이 있다.
ElasticSearch 8.x
SpringBoot 3.0.x
Spring data ElsticSearch 8.5.3
//build.gadle.kts
implementation("org.springframework.boot:spring-boot-starter-data-elasticsearch")
implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0")
Connector
Api key를 사용해도 되고 계정을 추가하고 권한을 넣어 사용해도 된다.
키바나에 아래 내용을 입력하면 api-key 가 생성된다.
POST /_security/api_key
{
"name": "spring_command", //키 이름
"expiration": "999d", //만료시간
"role_descriptors": {
"role-team-index-command": {
"cluster": ["all"],
"index": [
{
"names": ["*"],
"privileges": ["all"]
}
]
}
}
}
편의를 위해 모든 권한을 오픈한 키를 생성해주었다.
//Response
{
"id": "-DEcTY8BerRCjchqvHgn",
"name": "spring_command1",
"expiration": 1801299279912,
"api_key": "LtEeb4ixTIGsGVW-yzKAiw",
"encoded": "LURFY1RZOEJlclJDamNocXZIZ246THRFZWI0aXhUSUdzR1ZXLXl6S0Fpdw=="
}
생성된 api key는
management -> Security -> API keys 에서 관리할 수 있다.
Kotlin 설정
@Configuration
@EnableElasticsearchRepositories
class ESConfig(
@Value("\${spring.elasticsearch.uris}")
private val url:String,
@Value("\${spring.elasticsearch.api-key}")
private val apikey: String
): ElasticsearchConfiguration(){
override fun clientConfiguration(): ClientConfiguration {
val httpHeaders = HttpHeaders()
httpHeaders.add("Authorization", "ApiKey $apikey")
return ClientConfiguration.builder()
.connectedTo(url)
.withDefaultHeaders(httpHeaders)
.build()
}
}
ElasticsearchConfiguration 인터페이스를 구현체 클래스를 만들어 준다.
ClientConfiguraion 메서드를 구현해야 한다.
api키를 헤더에 넣어 uri 에 요청하면
아래와 같은 메세지가 뜨면 정상적으로 연결이 된 것이다.
tagline 을 주목하자
{
"name" : "es",
"cluster_name" : "es-docker",
"cluster_uuid" : "-",
"version" : {
"number" : "8.11.3",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "-",
"build_date" : "-",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Document 객체 (DAO 객체)
@Document(indexName = "es_post",createIndex = false, writeTypeHint = WriteTypeHint.FALSE)
public class EsPost {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String title;
@Field(type = FieldType.Text)
private String content;
@Field(type = FieldType.Long)
private Long categoryId;
@Field(type = FieldType.Keyword)
private String writerName;
@Field(type = FieldType.Integer)
private int viewCount = 0;
필자는 도메인 영역을 Java로 사용하고 있어서 DAO객체는 JAVA코드이다. (혼란스러워하지마시길)
@Document 라는 어노테이션을 달고 인덱스 명을 지정해준다
- indexName : 인덱스 이름 지정
- createIndex : 자동으로 인덱스 생성여부
- writeTypeHint : 데이터를 넣으면 자동으로 _Class 라는 필드가 생성되는것을 방지.
_class 필드가 생성되는 이유는 Java의 상속에 대해 필드가 나타내 주어야 할때 사용한다고 한다
더 궁금한점은 아래 링크를 보자
ElasticRepository
public interface PostElasticRepository extends ElasticsearchRepository<EsPost, Long> {
}
JPA Repository 처럼 생성 해준다.
Service
@Service
class EsPostServiceImpl(
private val esPostRepository: PostElasticRepository,
private val postRepository: PostRepository
) : EsPostService {
override fun exportPostsToElasticsearch (){
val posts = postRepository.findAll()
for (post in posts){
val esPost = EsPost(post)
esPostRepository.save(esPost) //ElasticSearch Repository
}
}
}
esPostRepository.save(esPost)
위 코드를보면 JpaRepository 처럼 사용하면 된다.
위 코드는 RDB -> 엘라스틱서치로 데이터를 넘겨주는 코드이다.
결과
설정만 일주일정도 삽질을 했다.
최신 레퍼런스가 없어서 헤더설정을 해주었는데 헤더가 안들어가고 이런저런 에로사항이 많았지만
결국 해결 했다.. 후 끗!
728x90
'개-발 > Infra' 카테고리의 다른 글
[AWS S3] 특정 확장자 업로드 방지 (0) | 2024.05.31 |
---|---|
[EasticSearch ] BulkApi 사용법 ( action_request_validation_exception ) (0) | 2024.05.28 |
[ElsticSearch] 엘라스틱서치 개념과 Query (0) | 2024.04.09 |
[Redis] 선착순 이벤트 구현 레디스 분산락 (Redisson DistributeLock) (0) | 2024.03.03 |
[Kafka] MSA 서버간 비동기 통신 (요청 - 응답 모델) (0) | 2024.02.29 |