//엘라스틱 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
spring.elastic.url=localhost:9200
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
현재(2025년 기준) 최신 안정 버전 중 하나.
버전은 필요 시 공식 DockerHub 참고해서 조정 가능
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
@Configuration
public class ElasticConfig extends ElasticsearchConfiguration {
@Value("${spring.elastic.url}")
private String elasticUrl;
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo(elasticUrl)
.build();
}
}
🔍 이 코드의 목적
Elasticsearch 클라이언트 커넥션을 설정하는 클래스
Spring Boot는 RestHighLevelClient → ElasticsearchClient로 넘어왔고,
지금은 ElasticsearchConfiguration을 상속해서 설정하는 게 표준이야.
public class ElasticConfig extends ElasticsearchConfiguration {
Spring이 Elasticsearch 클라이언트를 자동 구성하지 않도록 하고
우리가 직접 설정한 ClientConfiguration을 사용하게 함
@Value("${spring.elastic.url}")
private String elasticUrl;
application.yml 혹은 .properties에 있는 spring.elastic.url 값을 주입받음
예시: localhost:9200, elasticsearch:9200, etc
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo(elasticUrl)
.build();
}
Spring Data Elasticsearch가 사용할 HTTP 클라이언트 설정
connectedTo(...)는 하나 이상의 노드를 명시할 수 있음
내부적으로 ElasticsearchRestTemplate 혹은 ElasticsearchClient를 이 설정에 따라 생성
| 항목 | 설명 |
|---|---|
ElasticConfig | Elasticsearch 연결 설정 클래스 |
ElasticsearchConfiguration | Spring이 제공하는 기본 설정 템플릿 |
elasticUrl | 연결할 Elasticsearch 주소 |
clientConfiguration() | 연결 구성 리턴 (Host, 포트 등) |

package com.example.shopingplusassignment.domain.ProductDocument;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Setting;
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Setting(settingPath = "/static/elastic-settings.json")
@Document(indexName = "products")
public class ProductDocument {
@Id
@Field(name = "id", type = FieldType.Long)
private Long productId;
@Field(name = "name", type = FieldType.Text)
private String productName;
@Field(name = "description", type = FieldType.Text)
private String productDescription;
@Field(name = "price", type = FieldType.Long)
private Long productPrice;
@Field(name = "stock", type = FieldType.Long)
private Long productStock;
@Field(type = FieldType.Text)
private String productCategory;
@Field(name = "brandName", type = FieldType.Text)
private String brandName;
@Field(name = "sellerId", type = FieldType.Long)
private String sellerId;
}