일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- JPA
- 오블완
- 엘라스틱서치
- 자동화워크플로우
- Java
- 자바
- 헥사고날아키텍처
- 프로토콜역할
- 자료구조
- 캐시의 작동 원리
- kafka배포
- 스프링시큐리티
- QA
- springboot
- jwt토큰
- 프로세스와스레드의차이
- 하이브리드접근법
- 부트캠프
- Kafka
- STOMP
- nplus1
- N+1문제
- XSS
- 한화시스템부트캠프
- 테스트케이스
- 오버로딩
- selenium
- 메소드
- n8n
- 티스토리챌린지
- Today
- Total
아쿠의 개발 일지
[ElasticSearch] 엘라스틱 서치 도입 본문
현재 진행하는 Tiggle 프로젝트에 엘라스틱 서치를 도입하기 전에, 어떤 이점이 있고 어떻게 사용하면 좋을 지에 대해서 먼저 알아보게 되었다. 엘라스틱 서치를 도입하기 위해서 현재 키워드 기반 검색으로 구현해 둔 컨트롤러를 보며 생각했다. 어떤식으로 도입 할 수 있을지
1. Docker를 사용하여 엘라스틱 서치를 실행한다.
docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.10.2
1-1. 필요한 경우 Kibana도 함께 설치한다.
docker run -d --name kibana -p 5601:5601 --link elasticsearch:elasticsearch docker.elastic.co/kibana/kibana:8.10.2
2. 엘라스틱 서치 연동
: 현재 Tiggle Project는 gradle을 사용하고 있기에, build.gradle에 의존성을 추가 해 준다.
implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.17.14'
최신 버전이 필요하다면 OpenSearch나 Elasticsearch 8.x 에 맞는 Java Client를 사용하면 된다.
3. 데이터 인덱싱
: 필자는 공연 데이터를 엘라스틱 서치에 저장하여 활용할 것이기 때문에 저장하는 인덱스를 생성하고, 데이터를 동기화 시켜줘야 한다.
3-1 : 인덱스 생성
PUT /programs
{
"mappings": {
"properties": {
"programId": { "type": "keyword" },
"programName": { "type": "text", "analyzer": "standard" },
"reservationOpenDate": { "type": "date" },
"programInfo": { "type": "text", "analyzer": "standard" },
"programStartDate": { "type": "date" },
"programEndDate": { "type": "date" },
"imageFiles": { "type": "keyword" },
"locationName": { "type": "text", "analyzer": "standard" }
}
}
}
3-2 : 데이터 동기화
: 공연 DB에서 데이터를 읽어와 엘라스틱 서치에 저장하는 스크립트를 작성
public void indexProgramData(Program program) {
Map<String, Object> document = new HashMap<>();
document.put("programId", program.getId());
document.put("programName", program.getProgramName());
document.put("reservationOpenDate", program.getReservationOpenDate());
document.put("programInfo", program.getProgramInfo());
document.put("programStartDate", program.getProgramStartDate());
document.put("programEndDate", program.getProgramEndDate());
document.put("imageFiles", program.getImageUrls());
document.put("locationName", program.getLocationName());
IndexRequest request = new IndexRequest("programs")
.id(program.getId().toString())
.source(document);
elasticsearchClient.index(request, RequestOptions.DEFAULT);
}
4. 검색 로직 구현
: 기존 검색 로직을 엘라스틱 서치 기반으로 변경한다.
<이 부분은 이 글을 작성하고 할 예정>
5. 엘라스틱 서치와 DB의 동기화
: 실시간 동기화를 하여, 공연 데이터가 변경 되거나 추가 되면 엘라스틱 서치로 동기화를 한다.
여기서 든 의문의 Q&A
Q. 엘라스틱 서치를 가동 시킬 데이터를 미리 저장 시키는 것 같은데 그럼 데이터 저장소라고 생각하면 되는 건가?
A. 데이터 저장소는 맞지만, 주 저장소로 사용하기에는 부적합합니다.
엘라스틱 서치는 데이터를 저장할 수 있지만, 본래 목적은 검색과 분석에 특화 되어 있습니다.
Q. 그럼 엘라스틱 서치 데이터 저장 구조는 어떻게 돼?
A. JSON 형태로 인덱싱됩니다.
Q. 그럼 DB와의 관계를 알려줘
A. 검색 속도가 중요한 데이터만 엘라스틱 서치에 동기화를 해서, DB와 함께 사용하도록 합니다.
엘라스틱 서치만을 사용하지 않는 이유는 정합성 보장이 부족하고, 데이터 손실 위험이 있습니다. 또한 데이터 무결성을 관리하기 어렵습니다. 예를 들어, DB는 ACID 트랜잭션을 지원하지만, 엘라스틱 서치는 그렇지 않습니다.
검색 속도 최적화가 목적이라면, 데이터의 일부만 엘라스틱 서치에 저장하고 이를 효율적으로 검색하는 방식으로 사용하면 될 것 같습니다!
'Programming > Java' 카테고리의 다른 글
[N8N] AI와 N8N (0) | 2025.01.06 |
---|---|
[Java] 객체지향의 핵심 개념 & Spring Boot란? (0) | 2024.12.29 |
[아키텍처 패턴] 헥사고날 아키텍처(Hexagonal Architecture) (2) | 2024.11.21 |
[JPA] N+1 문제 해결 (1) | 2024.07.10 |
[Java] 캡슐화 (Encapsulation) (1) | 2024.07.06 |