1. Elastcisearch 설치 및 실행
Elastcisearch 7.17.12 버전 설치
현재 8.x 버전까지 나와있는데 라이브러리, 보안 설정 등 변경된 부분이 많아 7.17..2 버전을 사용했다.
https://www.elastic.co/kr/downloads/elasticsearch
Elastisearch 실행
path\bin\elasticsearch.bat
로컬환경에서 실행했다면 http://localhost:9200로 접속한 뒤 아래 화면이 뜨면 정상적으로 실행된 것이다.
2. Spring Boot Elasticsearch
a. 의존성 추가
implementation 'org.springframework.data:spring-data-elasticsearch'
b. application.yml
spring:
elasticsearch:
uris: "<http://localhost:9200>"
socket-timeout: "10s"
- ES 관련 설정부분이고, ES 서버 URL과 포트를 입력하여 연결정보를 설정한다.
- socket-timeout: ES와 통신 중 타임아웃 시간 설정 정보로 10s는 10초를 나타내며 통신 시 응답을 기다리는 최대 시간이 10초로 통신 중 10초 이상 응답이 없으면 타임아웃이 발생한다.
c. Product
@Document(indexName = "products")
@Getter
public class Product {
@Id
private String id;
private String name;
private String description;
private double price;
}
- <@Document(indexName = "products"): ES에서 인덱스와 매핑되는 클래스임을 정의
- @Id: RDBMS에서 고유식별자인 PK와 같은 의미로 Documet에서의 고유 식별자
d. ProductRepostiory
public interface ProductRepository extends ElasticsearchRepository<Product, String>{
// match 검색어는 or 조건으로 검색(name이 하나라도 포함되면 검색결과로 가져온다.)
// oeerator를 and 조건으로 변경할 수 있다
@Query("{\\"match\\": {\\"name\\": \\"?0\\"}}")
List<Product> findByName(String name);
}
- Elasticsearch와 상호작용하기 위한 ProductRepository로 Spring Data Elasticsearch에서 제공하는 ElasticsearchRepository extends한다.
- @Query를 사용하면 쿼리를 직접 작성해서 사용할 수 있다.
e. ProductController
@RestController
@RequiredArgsConstructor
public class ProductController {
private final ProductService productService;
@PostMapping("/create")
public void create(@RequestBody Product product) {
productService.create(product);
}
@GetMapping("/read")
public Optional<Product> read(String id) {
System.out.println(id);
return productService.read(id);
}
@GetMapping("/read_all")
public Iterable<Product> readAll() {
return productService.readAll();
}
@DeleteMapping("/delete")
public void delete(String id) {
productService.delete(id);
}
@PutMapping("/update")
public void update(@RequestBody Product product) {
productService.update(product);
}
@GetMapping("/read_name")
public List<Product> readName(String name) {
return productService.readName(name);
}
}
엔드포인트로 간단하게 테스트하기 위한 용도의 controller이다.
f. ProductService
@Service
@RequiredArgsConstructor
public class ProductService {
private final ProductRepository productRepository;
public void create(Product product) {
productRepository.save(product);
}
public Optional<Product> read(String id) {
return productRepository.findById(id);
}
public Iterable<Product> readAll() {
return productRepository.findAll();
}
public void delete(String id) {
productRepository.deleteById(id);
}
public void update(Product product) {
create(product);
}
public List<Product> readName(String name) {
return productRepository.findByName(name);
}
}
ProductRepository에서 데이터를 불러와 controller로 전달해주기 위한 보통의 Service부분이다.
'Programming > Spring' 카테고리의 다른 글
[Spring] @Autowired에서 조회 빈이 2개 이상인 경우 (1) | 2024.01.10 |
---|---|
[Spring] 순환참조 문제 해결 (1) | 2023.10.04 |
[Spring Boot] Spring Boot + Kafka 예제 (0) | 2023.09.26 |
[Spring Boot] Spring Data JPA + PostgreSQL 예제 (0) | 2023.09.25 |
[Spring Boot] Spring Boot + Redis CRUD 예제 (0) | 2023.09.24 |