[java] Guice와 Elasticsearch의 통합

Guice는 자바의 의존성 주입(Dependency Injection) 프레임워크로서, 개발자가 코드의 결합도를 낮추고 유지보수성을 높이기 위해 사용됩니다. Elasticsearch는 대용량의 데이터를 신속하게 저장하고 검색할 수 있는 오픈소스 검색 엔진입니다. 이번 글에서는 Guice와 Elasticsearch를 함께 사용하는 방법에 대해 알아보겠습니다.

Elasticsearch 클라이언트 생성

먼저 Elasticsearch를 사용하기 위해 Elasticsearch 클라이언트를 생성해야 합니다. Guice 모듈을 사용하여 Elasticsearch 클라이언트를 관리할 수 있습니다. 다음은 Elasticsearch 클라이언트를 생성하는 Guice 모듈의 예시입니다.

import com.google.inject.AbstractModule;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;

public class ElasticsearchModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(RestHighLevelClient.class).toInstance(createElasticsearchClient());
    }

    private RestHighLevelClient createElasticsearchClient() {
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost", 9200, "http")
        );
        // 다양한 Elasticsearch 설정을 구성할 수 있습니다.
        Settings settings = Settings.builder()
                .put("cluster.name", "myElasticsearchCluster")
                .build();

        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setDefaultCredentialsProvider(
                    new BasicCredentialsProvider()
                            .setCredentials(
                                    new AuthScope("localhost", 9200),
                                    new UsernamePasswordCredentials("username", "password")
                            )
            );
            return httpClientBuilder;
        });

        return new RestHighLevelClient(builder);
    }
}

위의 예시 코드에서는 ElasticsearchModule이라는 Guice 모듈을 정의하고, RestHighLevelClient의 인스턴스를 Singleton으로 바인딩하고 있습니다. createElasticsearchClient 메소드에서는 Elasticsearch 클러스터와 연결하기 위한 RestClientBuilder를 생성하고, Elasticsearch 호스트 및 포트를 설정합니다. 또한 인증 정보를 설정하고, 필요한 경우 Elasticsearch 클러스터의 다른 설정도 추가할 수 있습니다.

Elasticsearch 클라이언트 사용

Elasticsearch 클라이언트를 Guice에서 관리하기 때문에, 다른 클래스에서 사용하려면 해당 클래스에 의존성을 주입해야 합니다. Guice는 클래스들 간의 의존성을 자동으로 해결해주므로, Elasticsearch 클라이언트를 사용하는 클래스에서는 다음과 같이 의존성을 주입받을 수 있습니다.

import com.google.inject.Inject;
import org.elasticsearch.client.RestHighLevelClient;

public class MyElasticsearchService {
    private RestHighLevelClient client;

    @Inject
    public MyElasticsearchService(RestHighLevelClient client) {
        this.client = client;
    }

    public void performSearch(String keyword) {
        // Elasticsearch 클라이언트를 사용하여 검색 작업 수행
        // ...
    }
}

위의 예시 코드에서는 MyElasticsearchService 클래스가 Elasticsearch 클라이언트에 의존하도록 선언되어 있습니다. Guice는 @Inject 어노테이션을 통해 의존성을 자동으로 주입하므로, MyElasticsearchService 인스턴스를 생성할 때 Elasticsearch 클라이언트가 자동으로 주입됩니다.

결론

이번 글에서는 Guice와 Elasticsearch를 통합하는 방법에 대해 알아보았습니다. Guice를 사용하여 Elasticsearch 클라이언트를 생성하고, 의존성 주입을 통해 다른 클래스에서 Elasticsearch 클라이언트를 사용할 수 있게되었습니다. 이를 통해 코드의 유연성과 모듈성을 높이고, Elasticsearch와의 통합을 보다 효율적으로 관리할 수 있습니다.

참고자료: