동일한 환경에서 실습을 진행하기 위해 아래 버전을 사용할 것을 권장한다. - Spring Boot는 3.x.x 버전 - JDK 17

Spring Boot DevTools, Spring Web, Spring Data Elasticsearch (Access+Driver)를 선택해라. Spring Data Elasticsearch는 Spring Data JPA와 비슷한 원리로 작동하는 Elasticsearch 라이브러리이다.
이 프로젝트에서는application.properties를 지우고application.yml을 생성했다.
spring: elasticsearch: uris: http://localhost:9200 # 연결할 Elasticsearch 주소 logging: level: org.elasticsearch.client: TRACE # Elasticsearch의 쿼리 로그를 출력
@Document(indexName = "users") // users 인덱스의 Document임을 명시 public class UserDocument { @Id private String id; // Elasticsearch에서는 Document ID를 문자열(String)으로 다룸 @Field(type = FieldType.Keyword) // 매핑 정의 : keyword 타입 private String name; @Field(type = FieldType.Long) // 매핑 정의 : long 타입 private Long age; @Field(type = FieldType.Boolean) // 매핑 정의 : boolean 타입 private Boolean isActive; public UserDocument(String id, String name, Long age, Boolean isActive) { this.id = id; this.name = name; this.age = age; this.isActive = isActive; } public String getId() { return id; } public String getName() { return name; } public Long getAge() { return age; } public Boolean getIsActive() { return isActive; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setAge(Long age) { this.age = age; } public void setIsActive(Boolean isActive) { this.isActive = isActive; } }
getActive()라고 만들지 말고 getIsActive()라고 메서드명을 지어주자. 그리고 일관성을 위해 setActive()라고 만들지 말고 setIsActive()라고 메서드명을 지어주자.public interface UserDocumentRepository extends ElasticsearchRepository<UserDocument, String> { }

spring: elasticsearch: # Elasticsearch가 실행이 안 되고 있다는 걸 가정 or 주소를 잘못 입력했을 때를 가정 uris: http://localhost:9999 logging: level: org.elasticsearch.client: TRACE

Connection refused라는 에러 메시지가 출력된다. spring: elasticsearch: uris: http://localhost:9200 logging: level: org.elasticsearch.client: TRACE
DELETE /users

GET /users

{ "users": { "aliases": {}, "mappings": { "properties": { "_class": { "type": "keyword", "index": false, "doc_values": false }, # UserDocument에서 정의한 Field에 맞게 매핑(mapping)이 정의되어있다. "age": { "type": "long" }, "isActive": { "type": "boolean" }, "name": { "type": "keyword" } } }, "settings": { "index": { "routing": { "allocation": { "include": { "_tier_preference": "data_content" } } }, "refresh_interval": "1s", "number_of_shards": "1", "provided_name": "users", "creation_date": "1744519775043", "number_of_replicas": "1", "uuid": "FnbUnfg0QHWepqTBZEy5zQ", "version": { "created": "8521000" } } } } }
UserDocument에 맞게 인덱스가 생성됐다는 걸 알 수 있다.