카테고리 없음

spring boot와 elasticsearch 연동하기

라우브 2021. 5. 16. 20:46

기본적으로 spring boot와 elasticsearch를 연동하는 방법에는 네 가지가 있다.

  • ElasticsearchRepository
  • RestClient
  • HighLevelRestClient
  • ElasticsearchRestTemplate

ElasticsearchRepository

JPA 사용법과 거의 동일하다고 생각하면 될 듯 하다.

위와 같이 ElasticsearchRepository를 상속받는 interface를 선언하면 자동으로 구현체를 만들어준다.

 

이후 위와 같이 엔티티 클래스를 작성하고 ElasticActionLogRepository를 통해 저장해 본 결과 정상적으로 데이터가 입력되는 것을 확인할 수 있었다.

문제점

ElasticsearchRepository를 사용할 Entity Class는 Class 단위 어노테이션에 어떤 index로 저장할 지를 지정해주어야 한다.

class 단위 어노테이션에서 index를 결정하게 되면 동적으로 index를 지정할 수가 없다. (properties를 통해 설정한다던가)

 

로그 데이터의 경우 하루에도 엄청나게 많은 데이터가 쌓이기때문에 이를 효율적으로 관리하기 위해 데이터를 여러 공간에 분산시켜 저장해야 한다.(샤딩)

공간을 나누는 기준에도 여러가지가 있을 것이다. 

 

당장 떠오르는 방법은 월 별로 index를 생성하고 하나의 인덱스를 다수의 shard로 구성해서 저장할 생각인데, 만약 ElasticsearchRepository를 사용하면

현재 월에 따라 동적으로 index를 지정할 수가 없다. 그래서 다른 방법을 찾아야 했다.

 

RestClient & HighLevelRestClient

RestClient 와 HighLevelRestClient는 실제로 REST Api를 통해 elasticsearch와 통신한다. 

즉, http 수준의 통신이다.

 

index도 동적으로 할당할 수 있고, http메서드를 이용한 통신이라 elastic search의 대부분의 기능을 사용할 수 있다.

하지만, 사실 consumer 에서는 elasticsearch에 저장하는 기능만 필요하므로 다양한 기능이 필요가 없다.

따라서 TCP 수준의 통신을 이용하는 ElasticsearchRestTemplate을 사용하는 것이 더 효율적이라고 판단했다. (헤드 오버헤드가 작을테니)

 

ElasticsearchRestTemplate

  • Index를 동적으로 설정할 수 있어야 한다.
  • Http가 아닌 TCP 수준의 통신을 할 수 있는 가벼운 로직이었으면 한다

위 두 가지 요구사항을 모두 만족하기 때문에 ElasticsearchRestTemplate을 사용하여 elasticsearch와 연동했다.