본문 바로가기
프로그래밍/ElasticSearch

[elasticsearch + Spring] elasticsearch를 Java Spring에서 사용해보자 - 환경설정과 Index 만들기

by 사바라다 2021. 3. 10.

안녕하세요. 오늘은 Elastic에서 제공하는 SDK를 이용하여 Java에서 ElasticSearch에 통신히여 결과를 가져올 수 있도록 해보겠습니다. ElasticSearch의 이론적인 내용에 대해서는 추후에 별도 포스팅으로 여러분들께 공유드리도록 하겠습니다.

ElasticSearch API 종류

Elastic에서 제공하는 Java SDK는 2가지 종류가 있습니다. 첫번째는 Low Level SDK이며 두번째는 Hight Level SDK 입니다. 저희가 이번에 사용할 SDK는 Hight Level SDK입니다.

  • Java Low Level REST Client
    • ElasticSearch에서 제공하는 Low Level Java 통신 SDK 입니다. http 요청을 만들 수 있는 라이브러리입니다. ElasticSearch 버전에 종속되지 않고 좀 더 유연하게 사용할 수 있다는 장점이 있습니다.
    • 모든 요청의 http 메시지를 직접 생성한다고 보시면 됩니다. 아래 코드를 확인하시면 됩니다.
Request request = new Request("GET", "/");   
Response response = restClient.performRequest(request);

 

  • Java High Level REST Client
    • Java High Level REST Client는 Java Low Level REST Client를 한번 추상화 한 라이브러리입니다. Rest API가 아닌 이미 정의되어있는 코드를 통해서 요청하는 것을 기본으로합니다. 아래 예제를 보겠습니다. 아래 예제는 index에 하나의 document를 생성하는 메서드 중 일부를 가져온 부분입니다.
IndexRequest request = new IndexRequest(index)
        .id(id)
        .source(jsonBody, XContentType.JSON);

client.index(request, RequestOptions.DEFAULT);

오늘 저희는 Java High Level REST Client 라이브러리를 통해서 ElasticSearch와 통신해보도록 하겠습니다.

## 오늘 실습은 ElasticSearch 서버가 실행되어있고 통신이 가능하다라는것을 전재로합니다. 확인할 수 있는 방법은 ElasticSearch에 접속했을 때 아래와 같이 노출되면됩니다.

의존성

사용하기 위해서는 해당 라이브러리를 사용할 수 있는 모듈의 의존성을 가져오면됩니다. 저는 ElasticSearch 7.9.0 버전을 사용하기 때문에 이에 맞는 SDK 최신 버전인 7.9.3을 가져왔습니다.

implements 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.9.3'

환경 설정

먼저 ElasticSearch를 사용하기 위한 Configuration을 한번 보도록 하겠습니다. 아래 예제들은 Spring Framework 기반으로 만들어져 있습니다. 코드를 보도록 하겠습니다. 먼저 보이는 소스는 yml 파일입니다. url, port 등 변경 가능한 부분은 별도의 환경파일로 하여 분리하였습니다. 그리고 실제 Java 코드는 그 아래에 있습니다.

es:
  url: localhost
  port: 9200

RestHighLevelClient 객체를 만듭니다. 해당 객체가 실제 통신에 사용하는 객체입니다. 일반적인 통신에  사용하는 restTemplate을 생각해주시면 됩니다. 아래와 같이 선언합니다. ElasticSearch는 여러 노드를 등록할 수 있으며 HttpHost를 추가해주시면 됩니다. HttpHost의 파라미터로는 hostname, port 그리고 http 또는 https 사용의 스키마가 들어갑니다.

@Configuration
public class ElasticSearchConfig {

    @Value("${oci.es.url}")
    private String hostname; // localhost

    @Value("${oci.es.port}")
    private Integer port; // 9200

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(RestClient.builder(new HttpHost(hostname, port, "http")));
    }
}

high level client 모듈은 내부에 low lovel client를 감싸고 있습니다. 사용이 끝난 클라이언트는 close 메서드를 통해 닫아주어야 정확한 리소스 반환이 이루어집니다. 아래와 같이 사용할 수 있습니다.

private final RestHighLevelClient client;

인덱스 생성

ElasticSearch를 사용하기 위해서는 DataBase에 Table에 해당하는 인덱스를 먼저 만들어주어야 합니다. Index는 아래처럼 만들 수 있습니다. CreateIndexRequest 를 이용하여 요청할 내용을 담을 수 있는 모델을 만듭니다. 옵션을 Settings를 통해서 넣을 수 있습니다. 아래 세팅은 인덱스의 샤드(데이터 노드 분할 수)의 숫자와 레플리카(복사본)의 숫자압니다. request용 모델을 만든 후 RestHighLevelClient 객체의 create 메서드를 호출하면 생성되게 됩니다.

String indexName = "game";
CreateIndexRequest request = new CreateIndexRequest(indexName);

request.settings(Settings.builder()
    .put("index.number_of_shards", 1)
    .put("index.number_of_replicas", 0)
);

client.indices().create(request, RequestOptions.DEFAULT);

이렇게 만들어진 index는 아래와 같습니다.

마무리

오늘은 이렇게 ElasticSearch에서 제공하는 Java High Level REST Client SDK를 사용하여 Java로 ElasticSearch와 통신하기 위한 기본적인 환경설정을 알아보았고 간단하게 인덱스를 하나 생성해 보았습니다.

다음시간에는 Java를 통해 ElasticSearch의 인덱스의 데이터(Document)에 CRUD에 대해서 알아보도록 하겠습니다.

감사합니다.

참조

elastic 공식 사이트

댓글