From 8405cd78a1233e5589b36530bc4bc42edbcba320 Mon Sep 17 00:00:00 2001 From: daumi125 Date: Tue, 15 Jul 2025 16:14:54 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20[=EA=B8=B0=EB=8A=A5=EC=B6=94?= =?UTF-8?q?=EA=B0=80]=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20=EA=B8=B0?= =?UTF-8?q?=EC=82=AC=20=EC=A0=80=EC=9E=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [기능추가] 히스토리 기사 저장 구현 --- .../Domain/Kakao/entity/History.java | 6 ++ .../Kakao/repository/HistoryRepository.java | 3 + .../Kakao/service/KakaoMessageService.java | 57 +++++++++++++++++-- 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/entity/History.java b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/entity/History.java index c6b19c4..6dd42f7 100644 --- a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/entity/History.java +++ b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/entity/History.java @@ -3,13 +3,19 @@ import Baemin.News_Deliver.Domain.Mypage.Entity.Setting; import Baemin.News_Deliver.Global.News.JPAINSERT.entity.News; import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Entity @Table(name = "history") @Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor public class History { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/repository/HistoryRepository.java b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/repository/HistoryRepository.java index ca339df..2395d7d 100644 --- a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/repository/HistoryRepository.java +++ b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/repository/HistoryRepository.java @@ -2,7 +2,10 @@ import Baemin.News_Deliver.Domain.Kakao.dto.HistoryDTO; import Baemin.News_Deliver.Domain.Kakao.entity.History; +import Baemin.News_Deliver.Domain.Mypage.Entity.Setting; +import Baemin.News_Deliver.Global.News.JPAINSERT.entity.News; import org.springframework.data.jpa.repository.JpaRepository; public interface HistoryRepository extends JpaRepository { + boolean existsBySettingAndNews(Setting setting, News news); } diff --git a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/service/KakaoMessageService.java b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/service/KakaoMessageService.java index 470541a..9c0179f 100644 --- a/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/service/KakaoMessageService.java +++ b/SpringBoot/src/main/java/Baemin/News_Deliver/Domain/Kakao/service/KakaoMessageService.java @@ -2,10 +2,16 @@ import Baemin.News_Deliver.Domain.Auth.Entity.User; import Baemin.News_Deliver.Domain.Auth.Repository.UserRepository; +import Baemin.News_Deliver.Domain.Kakao.entity.History; +import Baemin.News_Deliver.Domain.Kakao.repository.HistoryRepository; import Baemin.News_Deliver.Domain.Mypage.DTO.SettingDTO; +import Baemin.News_Deliver.Domain.Mypage.Entity.Setting; +import Baemin.News_Deliver.Domain.Mypage.Repository.SettingRepository; import Baemin.News_Deliver.Domain.Mypage.service.SettingService; import Baemin.News_Deliver.Global.Kakao.KakaoTokenProvider; import Baemin.News_Deliver.Global.News.ElasticSearch.dto.NewsEsDocument; +import Baemin.News_Deliver.Global.News.JPAINSERT.entity.News; +import Baemin.News_Deliver.Global.News.JPAINSERT.repository.NewsRepository; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -34,6 +40,9 @@ public class KakaoMessageService { private final KakaoNewsService newsService; private final SettingService settingService; private final UserRepository userRepository; + private final NewsRepository newsRepository; + private final SettingRepository settingRepository; + private final HistoryRepository historyRepository; private static final String KAKAO_SEND_TOME_URL = "https://kapi.kakao.com/v2/api/talk/memo/send"; @@ -98,6 +107,7 @@ public boolean sendKakaoMessage() { /** * 사용자의 키워드를 바탕으로 뉴스를 검색하여 리스트로 반환하는 메서드입니다. + * * @return NewsEsDocument의 리스트 */ private List getNewsEsDocumentList() { @@ -132,15 +142,14 @@ private List getNewsEsDocumentList() { log.info("검색된 뉴스 수: {}", newsList.size()); newsList.forEach(n -> log.info("뉴스: {} - {}", n.getPublisher(), n.getSummary())); - if (newsList.size() < 1) { - log.warn("해당 키워드로 검색된 뉴스가 없습니다."); - return null; - } + // 검색된 뉴스를 히스토리로 보내는 코드 + if (saveHistory(newsList, settings)) return null; return newsList; } private static Map createTemplateData(List newsList) { + log.info("뉴스 전체 리스트 확인용:" + newsList); Map templateArgs = new HashMap<>(); //메세지 5개 고정 @@ -153,4 +162,44 @@ private static Map createTemplateData(List newsL } + private boolean saveHistory(List newsList, List settings) { + if (newsList == null || newsList.isEmpty()) { + log.warn("해당 키워드로 검색된 뉴스가 없습니다."); + return false; + } + + boolean saved = false; + + for (NewsEsDocument newsDoc : newsList) { + News newsitem = newsRepository.findById(Long.parseLong(newsDoc.getId())) + .orElseThrow(() -> new RuntimeException("뉴스가 존재하지 않습니다: " + newsDoc.getId())); + + for (SettingDTO settingDTO : settings) { + Setting setting = settingRepository.findById(settingDTO.getId()) + .orElseThrow(() -> new RuntimeException("설정이 존재하지 않습니다: " + settingDTO.getId())); + + // 중복 저장 방지용 코드 + boolean exists = historyRepository.existsBySettingAndNews(setting, newsitem); + if (exists) { + log.info("이미 저장된 뉴스입니다. (settingId={}, newsId={})", setting.getId(), newsitem.getId()); + continue; + } + + History history = History.builder() + .publishedAt(newsDoc.getPublished_at()) + .setting(setting) + .news(newsitem) + .settingKeyword(String.join(",", settingDTO.getSettingKeywords())) + .blockKeyword(settingDTO.getBlockKeywords() != null ? + String.join(",", settingDTO.getBlockKeywords()) : null) + .build(); + + historyRepository.save(history); + saved = true; + } + } + + return saved; + } + } \ No newline at end of file