본문 바로가기
🍃SpringFrameworks/SpringDataElasticsearch

[SpringDataElasticsearch] Client 구현을 통한 사용 방법

by inbeom 2023. 12. 16.
728x90
Elasticsearch 클라이언트를 직접 사용하여 클러스터 작업을 수행할 수 있지만 SpringDataElasticsearch 클라이언트를 사용하면 DataAccess, ObjectMapping, Annotation,  QueryDSL, Transaction 등을 이용하여 보다 쉽고 편리하게 Elasticsearch를 사용할 수 있게 도와준다.

 

 

 

Imperative Rest Client (명령형 REST 클라이언트)

전통적인 동기식 프로그래밍 방식을 따르며, 요청을 보내고 응답을 기다리는 동안 블로킹되는 방식을 동작한다.

Ex> RestTemplate, WebClient 등,, 

 

명령형 (비반응형) 클라이언트를 사용하기 위한 Bean 구성

@Configuration
public class MyClientConfig extends ElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder()           
			.connectedTo("localhost:9200")
			.build();
	}
}

 

ElasticsearchConfiguration 클래스를 사용하면 jsonpMapper() 또는 transportOptions() 메소드 등을 재정의하여 추가 구성이 가능하다 

 

ElasticsearchConfiguration의 ClientConfiguration Bean을 구성한 후 Spring 구성 요소에 주입 가능한 Bean.

ElasticsearchOperations operations;      

@Autowired
ElasticsearchClient elasticsearchClient; 

@Autowired
RestClient restClient;                   

@Autowired
JsonpMapper jsonpMapper;

기본적으로 Elasticsearch 클러스터와 상호작용 하려면 ElasticsearchOperations을 사용해야 한다. 

(Repository를 사용할 때 이 인스턴스도 내부적으로 사용됨)

 

 

Reactive Rest Client (반응형 REST 클라이언트)

반응성 프로그래밍 패러다임을 따르며, 비동기식 프로그래밍 방식으로 동작한다. 

요청을 보내고 응답을 기다리는 동안 블로킹되지 않으며, 비동기적으로 다른 작업을 수행할 수 있다.

 

반응형 스택으로 작업하기 위해선 다른 클래스를 상속 받아 Bean을 구성해야 한다.

@Configuration
public class MyClientConfig extends ReactiveElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder()           
			.connectedTo("localhost:9200")
			.build();
	}
}

 

ReactiveElasticsearchConfiguration 클래스를 사용하면 jsonpMapper() 또는 transportOptions() 메소드 등을 재정의하여 추가 구성이 가능하다 

 

 

ReactiveElasticsearchConfiguration의 ClientConfiguration Bean을 구성한 후 Spring 구성 요소에 주입 가능한 Bean.

@Autowired
ReactiveElasticsearchOperations operations;      

@Autowired
ReactiveElasticsearchClient elasticsearchClient; 

@Autowired
RestClient restClient;                           

@Autowired
JsonpMapper jsonpMapper;

기본적으로 Elasticsearch 클러스터와 상호작용 하려면 ReactiveElasticsearchOperations을 사용해야 한다. 

(Repository를 사용할 때 이 인스턴스도 내부적으로 사용됨)

 

 

Client Configuration (클라이언트 구성)

REST 클라이언트의 동작을 조정하기 위한 설정을 포함한다. 

Ex> 연결 시간 초과, 요청 및 응답 인터셉터, 프록시 설정 등.

 

클라이언트 동작은 SSL, 연결 및 소켓 시간 초과, 헤더 및 기타 매개변수에 대한 옵션을 설정할 수 있는 ClientConfiguration을 통해 변경할 수 있다.

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("some-header", "on every request") // 헤더 정의                   

ClientConfiguration clientConfiguration = ClientConfiguration.builder() // Builder Pattern을 사용하여 옵션 추가
  .connectedTo("localhost:9200", "localhost:9291")                      
  .usingSsl() // SSL 활성화 선택                     
  .withProxy("localhost:8888") // 프록시                                        
  .withPathPrefix("ela") // 접두사                        
  .withConnectTimeout(Duration.ofSeconds(5)) // 연결 시간                         
  .withSocketTimeout(Duration.ofSeconds(3)) // 소켓 시간                
  .withDefaultHeaders(defaultHeaders) // 헤더                                   
  .withBasicAuth(username, password) 기본 인증                                    
  .withHeaders(() -> { // Elasticsearch로 요청이 전송되기 전에 호출되는 헤더 설정 이벤트 생성                            
    HttpHeaders headers = new HttpHeaders();
    headers.add("currentTime", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    return headers;
  })
  .withClientConfigurer( // 생성된 ClientConfiguration을 여러 번 추가할 수 있다.                                                 
    ElasticsearchClientConfigurationCallback.from(clientBuilder -> {
  	  // ...
      return clientBuilder;
  	}))
  . // ... other options
  .build();
위와 같이 헤더 공급자를 추가하면, 시간이 지남에 따라 변할 수 있는 헤더를 주입하는 것이 가능해진다.
주로 인증 JWT 토큰과 같이 동적으로 변경되는 헤더 값을 삽입하는데 사용되는데, 이때 공급자 함수는 비동기적이며 블로킹되지 않는 형태로 작성되어야 한다.

 

 ※ Client configuration callbacks (클라이언트 구성 콜백)

클라이언트의 동작을 구성하기 위한 콜백 매커니즘이다. 

클라이언트의 특정 동작에 대한 콜백을 등록하거나 클라이언트의 동적인 구성을 변경하기 위해 콜백을 사용할 수 있다.

 

ClientConfiguration 클래스는 클라이언트를 구성하는 데 필요한 매개변수를 제공하는데, withClientConfigurer(ClientConfigurationCallback<?>) 메소드를 사용하여 콜백 함수를 추가해 구성을 추가할 수 있다.

 

RestClient

Elasticsearch를 구성하는데 사용할 수 있는 org.elasticsearch.client.RestClientBuilder를 제공한다.

ClientConfiguration.builder()
    .withClientConfigurer(ElasticsearchClients.ElasticsearchRestClientConfigurationCallback.from(restClientBuilder -> {
        // configure the Elasticsearch RestClient
        return restClientBuilder;
    }))
    .build();

 

HttpAsyncClient

HttpClient를 구성하는데 사용할 수 있는  org.apache.http.impl.nio.client.HttpAsyncClientBuilder를 제공한다.

ClientConfiguration.builder()
    .withClientConfigurer(ElasticsearchClients.ElasticsearchHttpClientConfigurationCallback.from(httpAsyncClientBuilder -> {
        // configure the HttpAsyncClient
        return httpAsyncClientBuilder;
    }))
    .build();

 

 

Client Logging (클라이언트 로깅)

클라이언트가 수행하는 작업 및 발생하는 이벤트를 기록하는 메커니즘이다.

로깅을 통해 주로 클라이언트의 동작을 추적하고 문제를 해결하며 디버깅, 성능 분석, 모니터링 등을 수행할 수 있다. 

 

Java REST 클라이언트는 Apache Async Http 와 동일한 로깅 라이브러리를 사용한다. (Apache Commons Logging)

 

로그 활성화 하기..!

 

Trace Logs

  1. Gradle 설정 추가

dependencies {
    implementation('org.slf4j:slf4j-api:1.8.0-beta2')
    implementation('ch.qos.logback:logback-classic:1.3.0-alpha4')
    implementation('org.slf4j:jcl-over-slf4j:1.8.0-beta2')
}

 

  2. commons-logging.jar 제외

dependencies {
    configurations.all {
        exclude group: "commons-logging", module: "commons-logging"
    }
}

 

  3. Logback 구성에 Trace Logger 추가

<logger name="tracer" level="TRACE" additivity="false">
    <appender-ref ref="your_appender_block_name" />
</logger>

 

RestClient Debug Logs

  RestClient 클래스에 대한 Dug Logger 활성화

<logger name="org.elasticsearch.client.RestClient" level="DEBUG" additivity="false">
    <appender-ref ref="your_appender_block_name" />
</logger>

 

 

 

 

- 끝 - 

 

 

 

reference.

https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/clients.html

 

Elasticsearch Clients :: Spring Data Elasticsearch

Client behaviour can be changed via the ClientConfiguration that allows to set options for SSL, connect and socket timeouts, headers and other parameters. Example 1. Client Configuration import org.springframework.data.elasticsearch.client.ClientConfigurat

docs.spring.io

 

728x90