[ElasticSearch] 버전별 Spring Boot 설정 정리
- 최근의 IT 를 보게되면 고성능 고효율의 하드웨어, 그리고 고수준의 소프트웨어들이 사용됨에 따라 수많은 데이터들이 생성되게 되었다.
이런 빅데이터를 실시간으로 처리하고 검색, 분석하는 능력이 중요해짐에 따라 수많은 솔루션들이 나오게 되었다.
그 중 ElasticSerach 는 빅데이터 처리, 실시간 로그분석 및 텍스트 검색에 중점을 두었다.
ElasticSearch는 이런 장점을 기반으로 APM(애플리케이션 성능 모니터링), 데이터 분석, 검색어 실시간 자동 완성 등
장점을 살린도구로 자리잡았다.
그렇기에 ElasticSearch 를 적용하기위해서 공부를 하는 사람들이 많이 보이는 추세이다.
다만 필자가 Spring boot 와의 연동을 위해 여러 자료를 많이 찾게 되었는데 이미 예전 버전이 되어버린 적용법이던지
출처가 불분명한 정보들 분류로 시간을 많이 할애했다. 이 글도 언젠간 잘못된 정보로 변질 할 수 있지만 현재의 정보를 취합해서 작성 해 보도록 하겠다.
본문의 제목대로 가장 많이 사용하는 프레임워크중 하나인 Spring Boot 와 ElasticSearch 에 대해서 포스팅 해보도록 하겠다.
Environment
- Spring Boot: 3.2.9
- ElasticSearch: 7.17.0
- Spring Data elasticsearch: 5.2.9
- Spring Data elasticsearch: 3.3.2
1. Spring 과 ElasticSearch
elasticsearch 또한 Spring 진영에서 편하게 사용될 수 있도록 Spring data 가 존재한다.
// Version = :3.3.2 || :5.2.9
implementation 'org.springframework.data:spring-data-elasticsearch'
해당 의존성을 사용하게 된다면, JPA 를 통해 RDB, NoSQL 처럼 Entity 객체로 Document 를 관리 할 수 있게된다.
Document 객체 예시
@Document(indexName = "movies")
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@Setting(replicas = 0)
public class MoviesDocument {
@Id
private String id;
@Field(type = FieldType.Text, docValues = false)
private String title;
@Field(type = FieldType.Long)
private Long year;
@Field(type = FieldType.Object)
private List<String> genre = new ArrayList<>();
@Field(type = FieldType.Text)
private String actor;
}
2. Spring Data Elasticsearch 변화 및 예제
Spring boot 와 ElasticSearch 의 통신 클라이언트는 크게 다음과 같다.
- TransportClient(Deprecated in 7.0.0)
- Java High Level REST Client (현재 가장 많이 사용되는 방식)
- Elasticsearch Java Client(4.4 이후 버전 권장)
Transport Client
Elasticsearch 7.0 버전부터 deprecated 되었다, Socket 통신을 사용하는 방식이었으며,
spring data elasticsearch 4.0 이전 버전에 대해서는 TransportClient 를 주로 사용되었고
4.x 이후로는 Java High Level Rest Client 를 권장 하고 있다.
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html
Settings settings = Settings.builder()
.put("client.transport.sniff", true)
.put("cluster.name, clusterName)
.build();
Transportclient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(New InetSocketAddress(ip, port)))
이처럼 클라이언트를 직접 설정하고 client 객체를 통해 index 에 대한 CRUD 를 사용했다.
High Level Rest Client
Spring data elasticsearch 4.0 ~ 4.4 버전까지 사용되던 방식이다.
주로 많은 블로그들에서 소개하고 있는 Config 설정 방법이다.
내부적으로는 HttpClient 모듈을 사용하며 HTTP 방식으로 ElasticSearch 와 통신한다.
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
// 또는
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
Elasticsearch Java Client
Spring data Elasticsearch 4.4 이후 버전 부터 전환 되었으며, 가장 최신 버전인 5.x 대 버전에서도
해당 방식을 유지하고 있다.
Elastic 팀이 High-Level Rest Client 대신 Elasticsearch Java Client 로 전환됨에 따라
더이상 High-Level Rest Client 사용을 권장하지 않으며, 새로운 Java Client 사용을 공식적으로 지원하고 있다.
High-Level Rest Client를 직접 사용하여 연결, 호출 작업 처리했던것에 비해서
ElasticserachConfiguration 내부적으로 처리하고 있는걸 확인할 수 있다.
@Configuration
public class ElasticsearchConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
}
}
방식의 변화에 따라서 가장 크게 변화한것중 하나는 Logging 이다.
logging.level.org.springframework.data.elasticsearch.client.WIRE=trace
High-Level Rest Client 를 사용할때 로깅은 이런방식으로 로깅할 수 있었는데
이제는 'tracer' package 를 통해 trace 레벨로 로깅을 권장한다.
<logger name="tracer" level="TRACE" additivity="false">
<appender-ref ref="your_appender_block_name" />
</logger>
5.x ElasticSearch Client 공식 Docs
추가 적으로 상황에 따라 아래 어노테이션을 사용하여, Elasticsearch 레포지토리를 설정하거나, 스캔작업을 할 수 있다.
하지만 해당 어노테이션이 생략되더라도 프로젝트 설정에 따라 자동으로 스캔될 수 있다.
Spring data JPA 와 같이 사용하여 아래와 같은 오류가 발생한 경우에도 설정을 고려해 보자.
unsatisfied dependency expressed through constructor parameter 0
@EnableElasticsearchRepositories(basePackages = "com.example.repository")
댓글