개발하는 햄팡이

[ES] Elasticsearch8.x.x & SpringBoot 연동 세팅하기 본문

Database/Elasticsearch

[ES] Elasticsearch8.x.x & SpringBoot 연동 세팅하기

hampangee 2024. 9. 27. 10:29

 

원래는 elasticsearch config와 kibana config를 먼저 세팅해야하는 것이 맞지만 기능개발이 조금 급해서 세팅부터 하는 것으로 했다...

1. dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation group: 'co.elastic.clients', name: 'elasticsearch-java', version: '8.13.3'

 

 

2. application.properties & .env

우리는 세팅을 application.yaml형태로 하기로 해서 

아래와 같이 설정했다.

# Elasticsearch Settings
elasticsearch:
  url: ${ELASTICSEARCH_URL}
  username: ${ELASTICSEARCH_USERNAME}
  password: ${ELASTICSEARCH_PASSWORD}
  fingerprint: ${ELASTICSEARCH_FINGERPRINT}

 

이 후 .env파일에 각 값을 입력

# ElasticSearch
ES_URL=localhost:9200
ES_USER_NAME=elastic
ES_USER_PASSWORD=elastic
ES_FINGERPRINT=비밀~~

 


3. ESConfig class파일

import co.elastic.clients.transport.TransportUtils;
import javax.net.ssl.SSLContext;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;

@Configuration
public class ESConfig extends ElasticsearchConfiguration {

    // Elasticsearch 호스트 URL (예: https://localhost:9200)
    @Value("${elasticsearch.url}")
    private String host;

    // Elasticsearch 기본 사용자 이름
    @Value("${elasticsearch.username}")
    private String username;

    // Elasticsearch 기본 사용자 비밀번호
    @Value("${elasticsearch.password}")
    private String password;

    // Elasticsearch 인증서 지문 (SSL 인증서와 연결된 Fingerprint)
    @Value("${elasticsearch.fingerprint}")
    private String fingerprint;

    @NotNull
    @Override
    public ClientConfiguration clientConfiguration() {
        // 주어진 fingerprint를 이용하여 SSLContext 생성
        SSLContext sslContext = TransportUtils.sslContextFromCaFingerprint(fingerprint);
        
        // Elasticsearch 클라이언트 설정
        return ClientConfiguration.builder()
                                  .connectedTo(host)  // 연결할 Elasticsearch 호스트
                                  .usingSsl(sslContext)  // SSL 사용 및 호스트 이름 검증 활성화
                                  .withBasicAuth(username, password)  // 기본 인증 설정
                                  .build();
    }
}

 

 

Elasticsearch 8.x.x부터는 기본적으로 HTTPS프로토콜이 활성화 되어있어 보안을 위해 자체 서명된 SSL 인증서를 이용하여 연결할 수 있게 했다.

 

Elastic을 처음 실행하면 username을 default로 elastic으로 주고, password, fingerprint, enrollmentToken을 주는데 이때 부는 fingerprint로 elasticsearch 서버에 접근할 수 있다.

개발환경에서는 .usingSsl(sslContext, (hostname, session) -> true)로 하면 ssl검증을 안해서 fingerprint가 필요없어진다.

 


 

다음에는 내 프로젝트에 맞게 index구조와 index template을 설정하고 한글 tokenizer인 nori를 설치하고 여러 세팅을 해볼 예정이다!