Conversation
Walkthrough카테고리 매핑에서 “보이스 피싱” 변형을 인식하도록 확장하고, 스케줄러의 크롤링 키워드 리스트에 공백 변형을 추가했으며, 뉴스 저장 스케줄 작업 종료 로그를 추가했습니다. 기타 로직 변화는 없습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant Scheduler as NewsSaveScheduler
participant Crawler as NewsCrawler
participant Category as Category.from()
Scheduler->>Crawler: fetch("보이스 피싱"/"보이스피싱","스미싱","메신저 피싱","몸캠")
Crawler->>Category: categorize(article.title)
Category-->>Crawler: VOICE_PHISHING / SMISHING / MESSAGE_VOICE_PHISHING / ETC
Crawler-->>Scheduler: Articles saved
Scheduler->>Scheduler: 로그 "뉴스 크롤링 스케줄링 완료"
Estimated code review effort🎯 2 (Simple) | ⏱️ ~7 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Suggested labels
Poem
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 1
🔭 Outside diff range comments (2)
src/main/java/com/blockguard/server/domain/news/domain/enums/Category.java (1)
6-12: 입력 정규화와 null-세이프 처리로 매핑 일관성을 강화하세요현재는 정확히 일치하는 문자열만 처리합니다. null 입력, 앞뒤/중간의 다양한 공백(스페이스, 탭, NBSP 등) 변형을 고려해 사전 정규화하면 누락과 분기 중복을 줄일 수 있습니다. 공백 제거만으로도 본 변경의 목적을 더 깔끔히 달성할 수 있습니다.
아래처럼 정규화 후 스위치 문을 단일 라벨로 간소화하는 것을 권장합니다.
- public static Category from(String input) { - return switch (input) { - case "보이스피싱", "보이스 피싱" -> VOICE_PHISHING; - case "스미싱" -> SMISHING; - case "메신저 피싱", "메신저피싱" -> MESSAGE_VOICE_PHISHING; - default -> ETC; - }; - } + public static Category from(String input) { + if (input == null) { + return ETC; + } + // 선(先) 정규화: 앞뒤 공백 제거 + 모든 공백(연속 포함) 제거 + String normalized = input.trim().replaceAll("\\s+", ""); + return switch (normalized) { + case "보이스피싱" -> VOICE_PHISHING; + case "스미싱" -> SMISHING; + case "메신저피싱" -> MESSAGE_VOICE_PHISHING; + default -> ETC; + }; + }원하시면 하이픈/중점 등 문장부호도 제거하는 정규화(예: replaceAll("[-_·・]", ""))까지 포함하도록 도와드릴 수 있습니다.
src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java (1)
27-36: 스케줄러도 공통 키워드 루프 사용으로 중복 제거 및 예외 격리동일 키워드 셋을 반복 호출하지 말고, 관리자용과 동일하게 루프를 사용하면 중복 제거와 예외 격리가 동시에 해결됩니다. 또한 한 키워드 실패가 전체 스케줄을 중단하지 않도록 try-catch를 루프 내부에 유지하세요.
@Scheduled(cron = "0 0 4 * * *") - public void saveNewsArticles() { + public void saveNewsArticles() { log.info("뉴스 크롤링 스케줄링 시작"); - daumNewsCrawler.fetchNewsFromDaum("보이스 피싱"); - daumNewsCrawler.fetchNewsFromDaum("스미싱"); - daumNewsCrawler.fetchNewsFromDaum("메신저 피싱"); - daumNewsCrawler.fetchNewsFromDaum("몸캠"); + for (String keyword : KEYWORDS) { + try { + daumNewsCrawler.fetchNewsFromDaum(keyword); + } catch (Exception e) { + log.warn("키워드 크롤링 실패: {}", keyword, e); + } + } log.info("뉴스 크롤링 스케줄링 완료"); }추가로 운영 환경이 KST 기준이라면, 아래처럼 타임존을 명시하는 것도 고려해 주세요:
@Scheduled(cron = "0 0 4 * * *", zone = "Asia/Seoul")
🧹 Nitpick comments (1)
src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java (1)
19-22: 로그 메시지 언어 일관성 제안다른 로그는 한글인데, 여기만 영어 메시지입니다. 한글로 맞추면 운영 중 가독성이 좋아집니다.
- log.warn("Failed to crawl news for keyword: {}", keyword, e); + log.warn("키워드 크롤링 실패: {}", keyword, e);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/main/java/com/blockguard/server/domain/news/domain/enums/Category.java(1 hunks)src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java(2 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java (3)
src/main/java/com/blockguard/server/infra/crawler/DaumNewsCrawler.java (2)
DaumNewsCrawler(24-137)fetchNewsFromDaum(32-116)src/test/java/com/blockguard/server/infra/crawler/DaumNewsCrawlerTest.java (2)
크롤링_테스트(12-18)DaumNewsCrawlerTest(7-19)src/main/java/com/blockguard/server/domain/admin/api/AdminApi.java (1)
crawlNewsManually(52-57)
🔇 Additional comments (2)
src/main/java/com/blockguard/server/domain/news/domain/enums/Category.java (1)
8-8: "보이스피싱" ↔ "보이스 피싱" 동시 매핑 추가, 의도에 부합합니다공백 변형을 동일 카테고리(VOICE_PHISHING)로 매핑해 중복/누락을 줄이는 방향이 타당합니다.
src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java (1)
35-35: 완료 로그 추가 좋습니다스케줄 종료 지점을 명확히 남겨 모니터링과 장애 분석에 도움이 됩니다.
| public void crawlingForAdmin() { | ||
| String[] keywords = {"보이스 피싱", "보이스피싱", "스미싱", "메신저 피싱", "몸캠"}; | ||
| for (String keyword : keywords) { |
There was a problem hiding this comment.
🛠️ Refactor suggestion
키워드 상수화 및 재사용: 중복 로직/오타 리스크를 줄이세요
관리자 수동 크롤링과 스케줄러에서 동일한 키워드 셋을 반복 선언하지 말고, 클래스 상수로 정의해 단일 소스로 관리하세요. 또한 배열 대신 불변 List 사용을 권장합니다.
아래 변경으로 crawlingForAdmin()에서 상수 재사용이 가능합니다.
- public void crawlingForAdmin() {
- String[] keywords = {"보이스 피싱", "보이스피싱", "스미싱", "메신저 피싱", "몸캠"};
- for (String keyword : keywords) {
+ public void crawlingForAdmin() {
+ for (String keyword : KEYWORDS) {그리고 클래스 상단에 다음을 추가하세요(선택 코드, 참고용):
// import java.util.List;
private static final List<String> KEYWORDS =
List.of("보이스 피싱", "보이스피싱", "스미싱", "메신저 피싱", "몸캠");🤖 Prompt for AI Agents
In
src/main/java/com/blockguard/server/domain/news/scheduler/NewsSaveScheduler.java
around lines 15 to 17, replace the locally declared String[] keywords with a
single immutable class-level constant to avoid duplication and typos: add a
private static final List<String> KEYWORDS = List.of(...); at the top of the
class (ensure java.util.List is imported) and update crawlingForAdmin() to
iterate over KEYWORDS instead of declaring a new array; use List.of to create an
unmodifiable list so other methods (like the admin manual crawler) can reuse the
same constant.
💻 Related Issue
closed #64
🚀 Work Description
Summary by CodeRabbit