"use client"; import React, { useState, useEffect } from "react"; export interface RSSFeedInfo { name: string; type: "naver" | "generic"; url?: string; blogId?: string; itemCount?: number; lastUpdated?: Date; } export interface RSSManagerProps { ragEngine?: any; onFeedAdded?: (feedInfo: RSSFeedInfo) => void; onFeedRemoved?: (feedName: string) => void; onFeedRefreshed?: (feedName: string, itemCount: number) => void; } // RSS 통합 관리 컴포넌트 export function RSSManager({ ragEngine, onFeedAdded, onFeedRemoved, onFeedRefreshed, }: RSSManagerProps) { // 탭 상태 관리 const [activeRSSTab, setActiveRSSTab] = useState("manual"); const rssTabs = [ { id: "manual", label: "수동 학습", icon: "📖" }, { id: "auto", label: "자동화 관리", icon: "🤖" }, ]; return (
{/* RSS 서브 탭 */}
{activeRSSTab === "manual" && } {activeRSSTab === "auto" && }
); } // 수동 RSS 학습 컴포넌트 function ManualRSSManager() { const [rssUrl, setRssUrl] = useState(""); const [rssFeeds, setRssFeeds] = useState([]); const [loading, setLoading] = useState(false); const [processing, setProcessing] = useState(false); const [savedFeeds, setSavedFeeds] = useState([]); // 저장된 RSS 피드 목록 로드 useEffect(() => { const saved = localStorage.getItem("naverRssFeeds"); if (saved) { setSavedFeeds(JSON.parse(saved)); } }, []); // RSS 피드 가져오기 const fetchRSSFeed = async () => { if (!rssUrl.trim()) return; try { setLoading(true); setRssFeeds([]); const response = await fetch("/api/rag/rss", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url: rssUrl }), }); const data = await response.json(); if (data.success) { setRssFeeds(data.items || []); } else { console.error("RSS 피드 가져오기 실패:", data.error); alert("RSS 피드를 가져오는데 실패했습니다: " + data.error); } } catch (error) { console.error("RSS 피드 가져오기 중 오류:", error); alert("네트워크 오류가 발생했습니다."); } finally { setLoading(false); } }; // RSS 피드를 RAG 시스템에 학습 const processRSSFeed = async (items: any[]) => { if (items.length === 0) return; try { setProcessing(true); const response = await fetch("/api/rag/rss/process", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items }), }); const data = await response.json(); if (data.success) { alert( `${data.processedCount}개의 RSS 아이템이 성공적으로 학습되었습니다.` ); // RSS URL을 저장된 목록에 추가 if (!savedFeeds.includes(rssUrl)) { const newSavedFeeds = [...savedFeeds, rssUrl]; setSavedFeeds(newSavedFeeds); localStorage.setItem("naverRssFeeds", JSON.stringify(newSavedFeeds)); } } else { console.error("RSS 학습 실패:", data.error); alert("RSS 학습에 실패했습니다: " + data.error); } } catch (error) { console.error("RSS 학습 중 오류:", error); alert("네트워크 오류가 발생했습니다."); } finally { setProcessing(false); } }; // 저장된 RSS 피드 삭제 const removeSavedFeed = (feedUrl: string) => { const newSavedFeeds = savedFeeds.filter((url) => url !== feedUrl); setSavedFeeds(newSavedFeeds); localStorage.setItem("naverRssFeeds", JSON.stringify(newSavedFeeds)); }; return (
{/* RSS URL 입력 */}

📖 RSS 피드 수동 학습

네이버 블로그 RSS 피드를 직접 가져와서 RAG 시스템에 즉시 학습시킵니다.

setRssUrl(e.target.value)} placeholder="https://rss.blog.naver.com/{블로그아이디}" className="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* 네이버 블로그 RSS 예제 */}

네이버 블로그 RSS 예제:

https://rss.blog.naver.com/{"{블로그아이디}"}
예: https://rss.blog.naver.com/myblog123
{/* 저장된 RSS 피드 목록 */} {savedFeeds.length > 0 && (

저장된 RSS 피드

{savedFeeds.map((feedUrl, index) => (
{feedUrl}
))}
)} {/* RSS 피드 결과 */} {rssFeeds.length > 0 && (

RSS 피드 결과 ({rssFeeds.length}개 아이템)

{rssFeeds.map((item, index) => (
{item.title}

{item.description}

발행일: {new Date(item.pubDate).toLocaleString("ko-KR")} 원문 보기
))}
)}
); } // 자동 RSS 관리 컴포넌트 function AutoRSSManager() { const [registeredUrls, setRegisteredUrls] = useState([]); const [newUrl, setNewUrl] = useState(""); const [loading, setLoading] = useState(false); const [updating, setUpdating] = useState(false); const [message, setMessage] = useState(""); const [updateResults, setUpdateResults] = useState([]); // 등록된 RSS URL 목록 로드 const loadRegisteredUrls = async () => { try { setLoading(true); const response = await fetch("/api/rag/rss/auto-update"); const data = await response.json(); if (data.success) { setRegisteredUrls(data.urls); } else { console.error("RSS URL 목록 로드 실패:", data.error); setMessage("RSS URL 목록을 불러오는데 실패했습니다."); } } catch (error) { console.error("RSS URL 목록 로드 중 오류:", error); setMessage("네트워크 오류가 발생했습니다."); } finally { setLoading(false); } }; // RSS URL 등록 const registerUrl = async () => { if (!newUrl.trim()) { setMessage("RSS URL을 입력해주세요."); return; } try { setLoading(true); setMessage(""); const response = await fetch("/api/rag/rss/auto-update", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "register", url: newUrl.trim() }), }); const data = await response.json(); if (data.success) { setRegisteredUrls(data.urls); setNewUrl(""); setMessage("RSS URL이 자동 업데이트 목록에 등록되었습니다!"); setTimeout(() => setMessage(""), 3000); } else { setMessage("RSS URL 등록에 실패했습니다: " + data.error); } } catch (error) { console.error("RSS URL 등록 중 오류:", error); setMessage("네트워크 오류가 발생했습니다."); } finally { setLoading(false); } }; // RSS URL 등록 해제 const unregisterUrl = async (url: string) => { if ( !confirm(`이 RSS URL을 자동 업데이트 목록에서 제거하시겠습니까?\n${url}`) ) { return; } try { setLoading(true); setMessage(""); const response = await fetch("/api/rag/rss/auto-update", { method: "DELETE", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url }), }); const data = await response.json(); if (data.success) { setRegisteredUrls(data.urls); setMessage("RSS URL이 자동 업데이트 목록에서 제거되었습니다!"); setTimeout(() => setMessage(""), 3000); } else { setMessage("RSS URL 제거에 실패했습니다: " + data.error); } } catch (error) { console.error("RSS URL 제거 중 오류:", error); setMessage("네트워크 오류가 발생했습니다."); } finally { setLoading(false); } }; // 수동 업데이트 실행 const runManualUpdate = async () => { if (registeredUrls.length === 0) { setMessage("등록된 RSS URL이 없습니다."); return; } if (!confirm("등록된 모든 RSS를 지금 업데이트하시겠습니까?")) { return; } try { setUpdating(true); setMessage(""); setUpdateResults([]); const response = await fetch("/api/rag/rss/auto-update", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "update-all" }), }); const data = await response.json(); if (data.success) { setUpdateResults(data.results); setMessage( `RSS 업데이트 완료: ${data.summary.success}/${data.summary.total} 성공` ); } else { setMessage("RSS 업데이트에 실패했습니다: " + data.error); } } catch (error) { console.error("RSS 업데이트 중 오류:", error); setMessage("네트워크 오류가 발생했습니다."); } finally { setUpdating(false); } }; // 컴포넌트 마운트 시 등록된 URL 목록 로드 useEffect(() => { loadRegisteredUrls(); }, []); return (
{/* 메시지 표시 */} {message && (
{message}
)} {/* 자동 업데이트 설명 */}

📅 자동 업데이트 스케줄

등록된 RSS 피드는 매일 새벽 1시에 자동으로 최신 내용을 학습합니다.
수동으로 즉시 업데이트하려면 아래 "지금 업데이트" 버튼을 사용하세요.

{/* RSS URL 등록 */}

🤖 RSS 자동화 관리

setNewUrl(e.target.value)} placeholder="https://rss.blog.naver.com/{블로그아이디}" className="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

네이버 블로그 RSS URL을 등록하면 매일 자동으로 최신 포스트를 학습합니다.

{/* 등록된 RSS URL 목록 */}

등록된 RSS 목록

{registeredUrls.length === 0 ? (
등록된 RSS URL이 없습니다.
) : (
{registeredUrls.map((url, index) => (
{url}
매일 새벽 1시 자동 업데이트
))}
)}
{/* 업데이트 결과 */} {updateResults.length > 0 && (

최근 업데이트 결과

{updateResults.map((result, index) => (
{result.url}
{result.success ? "✅ 성공" : "❌ 실패"}
{result.success ? result.message : result.error}
))}
)}
); }