본문 바로가기

개발/Spring

[Spring] Elasticsearch를 Spring에 적용해보자(2)

이전 글에서 야심차게 Elasticsearch 환경을 구축하고 테스트까지 하였지만,

라이선스 관련 문제로 Opensearch로 변경하게 되었다.

spring-data-elasticsearch를 사용하기 애매해졌지만, 이미 진행한 부분까지는 작성해보고자 한다.

이후에는 Opensearch 전환 및 적용기를 작성하겠다.

 

Elasticsearch 연동을 위한 SpringBoot 프로젝트를 하나 생성(과정 생략)하고, application.yml에 의존성을 추가한다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
}

이후 연결을 위한 Configuration 클래스를 생성한다.

@Configuration
public class ElasticConfig extends ElasticsearchConfiguration {

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

인덱스와 연결할 @Document 타입의 클래스를 하나 생성해준다. JPA의 Entity와 유사하다고 보면 된다.

@Document(indexName = "my_index")
@Getter
public class ElasticModel {

    @Id
    private String id;

    @Field(type = FieldType.Text)
    private String name;
}

spring-data-elasticsearch가 제공하는 Repository를 구현한 자체 인터페이스를 만들었다.

이후 간단하게 "name" filed를 기준으로 검색하는 로직을 구현했다.

public interface ElasticRepository extends ElasticsearchRepository<ElasticModel, String> {
    List<ElasticModel> findByName(String name);
}

이후 Controller - Service 를 통해 미리 저장해 둔 인덱스를 조회해본다.

@Slf4j
@RequiredArgsConstructor
@Service
public class ElasticService {

    private final ElasticRepository elasticRepository;

    public void findValue() {
        List<ElasticModel> model = elasticRepository.findByName("kadun");
        log.info("ID = {}", model.get(0).getId());
        log.info("Name = {}", model.get(0).getName());
    }
2023-08-20T12:30:25.344+09:00  INFO 18188 --- [nio-8080-exec-2] c.e.esexample.service.ElasticService     : ID = 1
2023-08-20T12:30:25.346+09:00  INFO 18188 --- [nio-8080-exec-2] c.e.esexample.service.ElasticService     : Name = kadun

실제로 값이 맞는지 직접 browser url을 통해 확인해보자.

GET: http://localhost:9200/my_index/_doc/1

Response
{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "name": "kadun"
  }
}

Spring을 이용한 가장 간단한 Elasticsearch 조회 방법에 대해 알아보았다.

Elasticsearch 는 훨씬 더 복잡하고 다양한 기능들을 지원하고, 다양한 비즈니스 환경에서의 요구사항에 맞는 조회 방법들을 제시하고 있다.

물론 Spring-data-elasticsearch를 통해서도 그러한 조회 기능들을 충분히 활용할 수 있으며,

몇 가지 방식들이 존재하는데(Criteria, NativeQeury, @Query 등..)

지금은 간단한 사용법 정도만 숙지하고 있고, 이 부분에 대해서는 다음에 이어서 작성하고자 한다.