diff --git a/build.gradle b/build.gradle index 119ed77..029e3da 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,10 @@ dependencies { implementation group: 'com.mysql', name: 'mysql-connector-j', version: '8.3.0' implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.31.0' + + // ElasticSearch + implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' + implementation 'jakarta.json:jakarta.json-api:2.1.1' } tasks.named('test') { diff --git a/src/main/java/com/playhive/batch/news/entity/NewsDocument.java b/src/main/java/com/playhive/batch/news/entity/NewsDocument.java new file mode 100644 index 0000000..4003fbf --- /dev/null +++ b/src/main/java/com/playhive/batch/news/entity/NewsDocument.java @@ -0,0 +1,24 @@ +package com.playhive.batch.news.entity; + +import jakarta.persistence.Id; +import lombok.*; +import org.springframework.data.elasticsearch.annotations.Document; + +import java.time.LocalDateTime; + +@Document(indexName = "news") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class NewsDocument { + + @Id + private String id; + + private String title; + private String content; + private String category; + private LocalDateTime postDate; +} diff --git a/src/main/java/com/playhive/batch/news/repository/NewsSearchRepository.java b/src/main/java/com/playhive/batch/news/repository/NewsSearchRepository.java new file mode 100644 index 0000000..db0c99a --- /dev/null +++ b/src/main/java/com/playhive/batch/news/repository/NewsSearchRepository.java @@ -0,0 +1,10 @@ +package com.playhive.batch.news.repository; + +import com.playhive.batch.news.entity.NewsDocument; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +public interface NewsSearchRepository extends ElasticsearchRepository { + +} diff --git a/src/main/java/com/playhive/batch/news/service/NewsService.java b/src/main/java/com/playhive/batch/news/service/NewsService.java index 7c7e321..08e0b32 100644 --- a/src/main/java/com/playhive/batch/news/service/NewsService.java +++ b/src/main/java/com/playhive/batch/news/service/NewsService.java @@ -1,5 +1,8 @@ package com.playhive.batch.news.service; +import com.playhive.batch.news.entity.NewsDocument; +import com.playhive.batch.news.repository.NewsSearchRepository; +import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -10,6 +13,8 @@ import lombok.RequiredArgsConstructor; +import java.util.List; + @Service @RequiredArgsConstructor @Transactional @@ -17,10 +22,48 @@ public class NewsService { private final NewsRepository newsRepository; private final NewsCountService newsCountService; + private final NewsSearchRepository newsSearchRepository; + + @PostConstruct + public void setUpES() { + System.out.println("================ 초기화 시작 ==================="); + List allNews = newsRepository.findAll(); + syncToElastic(allNews); + System.out.println("================ 초기화 완료 ==================="); + } + + public void syncToElastic(List newsList) { + int batchSize = 1000; + + for (int i = 0; i < newsList.size(); i += batchSize) { + int end = Math.min(i + batchSize, newsList.size()); + List chunk = newsList.subList(i, end).stream() + .map(news -> NewsDocument.builder() + .id(news.getId().toString()) + .title(news.getTitle()) + .content(news.getContent()) + .category(news.getCategory().name()) + .postDate(news.getPostDate()) + .build()) + .toList(); + + newsSearchRepository.saveAll(chunk); + } + } public void saveNews(NewsSaveRequest newsSaveRequest) { News news = newsRepository.save(newsSaveRequest.toEntity()); newsCountService.saveNewsCount(news); + + NewsDocument doc = NewsDocument.builder() + .id(String.valueOf(news.getId())) + .title(news.getTitle()) + .content(news.getContent()) + .category(news.getCategory().name()) + .postDate(news.getPostDate()) + .build(); + + newsSearchRepository.save(doc); } public String findRecentPostDate(NewsCategory category) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9be3a96..2168bbb 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,7 +15,6 @@ spring: hikari: maximum-pool-size: 20 - jpa: show-sql: false properties: @@ -32,6 +31,9 @@ spring: # none 기존테이블을 더 이상 건드리지 않음. open-in-view: true + elasticsearch: + uris: http://{es-server-ip}:9200 + logging: level: root: info # 전체 로그를 INFO, DEBUG, WARN 수준으로 설정