금융 뉴스 정형 적재
이 튜토리얼은 admin 이 GenD 의 공용 수집기 (관리형) 에 RSS 뉴스 소스를 등록하고, 수집된 기사를 SQL 로 분석 / 가격 시계열과 join 가능하게 하는 흐름을 다룹니다.
🎯 언제 이 흐름을 쓰나: 뉴스를 컬럼 단위 SQL (제목 / 발행일 / URL / 본문 발췌) 로 다루고 싶을 때. (Silver 의
body_excerpt는 저작권 가드로 200자 cap — 전문이 필요하면 RAG 흐름 병행) RAG / AI Chat 에 본문을 검색용 코퍼스로 넣고 싶다면financial-news-rag가 훨씬 단순합니다 — 두 흐름은 병행 사용 가능합니다. 전사 공용이 아닌 팀 전용 소스라면 직접 조립 파이프라인 (셀프서비스) 로 rest_source 를 쓰는 경로도 있습니다.
수집 경로 정본: 공용 수집기 (관리형) 의 rss 수집기 (/admin/intel-sources, admin 전용). 구 "자동 수집" 화면과 구 "금융 뉴스 데이터 소스" 관리 메뉴는 은퇴했습니다(#2533) — rss 타입의 구 CollectionSource 신규 생성은 410 으로 차단됩니다. 수집 결과는 Bronze(iceberg.bronze.intel_articles_raw) → Silver(PG intel_articles, Trino 에서는 gendpg 카탈로그로 조회) 로 적재됩니다. 화면 소비처인 인텔리전스 → 뉴스·토픽 은 현재 "준비 중" 배지 상태라, 이 튜토리얼에서는 SQL 편집기로 조회합니다.
ℹ️ 아래 스크린샷은 구 화면 기준이라 현재 공용 수집기 UI 와 다를 수 있습니다 (재캡처 캠페인에서 일괄 갱신 예정).
사전 준비
- 권한:
admin역할 (Keycloakgendrealm) — 공용 수집기 등록은 admin 전용. SQL 조회는 일반 사용자도 가능. - 소스 URL: 안정적인 RSS 피드 URL. 사이트 robots.txt + 약관 확인 필수.
- API 키: 불필요 —
rss수집기는 키가 필요 없습니다. - schedule: 뉴스는 매일 자정 직후 1회 (예:
30 0 * * *UTC) 또는 매시간 프리셋이 기본값.
1단계 — 사이드바에서 메뉴 진입
사이드바 하단 ⚙ 관리 콘솔 → 데이터플레인 설정 → 공용 수집기 (관리형) (/admin/intel-sources) 으로 이동합니다. 처음 접속 시 빈 상태입니다.

2단계 — 소스 추가
상단의 신규 등록 버튼을 누르면 등록 다이얼로그가 열립니다. 수집기를 rss 로 선택하면 "API 키 불필요" 안내가 표시됩니다.

| 필드 | 설명 | 권장값 (한경 RSS 예시) |
|---|---|---|
| 이름 | 운영자가 식별하는 라벨 | 한경 금융 RSS |
| 수집기 (collector_type) | 수집기 종류 | rss |
| 도메인 | rss 수집기는 articles 만 지원 | articles |
| params_json | 피드 목록 (url / publisher / lang) | 아래 참조 |
| 스케줄 (cron) | 비워두면 수동 실행 전용 | 30 0 * * * (매일 00:30 UTC) |
| 활성화 | 스케줄 자동 실행 대상 포함 | 켜짐 |
한 사이트의 카테고리별로 분리하고 싶으면 (예: 한경 금융 / 한경 산업) 별도 소스 row 로 등록하거나, params_json.feeds 배열에 피드를 추가하세요.
3단계 — params_json 입력 + 검증
rss 수집기의 params_json 은 feeds 배열을 받습니다. 각 피드는 url(필수) / publisher / lang 을 갖습니다.
{
"feeds": [
{
"url": "https://www.hankyung.com/feed/finance",
"publisher": "hankyung",
"lang": "ko"
}
]
}

저장 버튼을 누르면 즉시 목록에 추가되고 sonner toast 로 성공 알림이 표시됩니다.

목록 컬럼: 이름 / 수집기 / 도메인 / 스케줄 / 활성 / 마지막 상태 / 마지막 실행 / 작업 (▶ 실행 / Edit / Delete).
4단계 — 첫 수집 실행
스케줄이 다음 tick 까지 기다리지 않고 즉시 결과를 확인하려면 목록 행의 ▶ 실행 버튼을 누릅니다. 응답 토스트에 records/errors 건수가 즉시 표시됩니다.
- 스케줄을 설정해 두면 Dagster
intel_source_cron_sensor가 60초마다 cron 만기를 평가해 자동 실행합니다. - Bronze → Silver 반영은
intel_source_dynamic_partition_sensor(Dagster) 가 담당합니다. Bronze 는 신선한데 Silver 가 안 늘면 해당 센서의 RUNNING 여부를 확인하세요. - 키 미주입 등으로 팩토리 단계에서 거부되면
failed가 아니라idle로 남을 수 있습니다 (rss 는 키 불필요라 해당 없음).
5단계 — Trino 로 결과 검증
SQL 편집기 에서 다음 쿼리를 실행합니다. Silver 뉴스 테이블은 PG 에 있고, Trino 에서는 gendpg federation 카탈로그로 노출됩니다.
SELECT title, url, published_at
FROM gendpg.public.intel_articles
WHERE source = 'rss:hankyung'
ORDER BY published_at DESC
LIMIT 10;

실제 기사 제목과 URL, UTC 발행 시각이 그대로 들어와 있으면 성공입니다. gendpg 는 read-only 카탈로그이며 인증/감사 계열 테이블은 403 으로 차단됩니다 — 자세한 내용은 Silver PG → Trino Catalog (gendpg) 운영 가이드 참조.
REST API / CLI 로 사용하기
UI 의 등록/조회 흐름은 REST API 와 gend CLI 로 동일하게 수행할 수 있습니다.
0. 토큰 발급 + 환경변수 설정
GenD 에 이미 SSO 로그인한 사용자라면 우상단 사용자 메뉴에서 한 번의 클릭으로 현재 세션 토큰을 복사할 수 있습니다.
UI 흐름 (권장)
-
https://gend.genon.ai우상단 아바타 → 드롭다운에 API 토큰 메뉴가 노출됩니다.
-
클릭하면 다이얼로그가 열리고 현재 세션의 access_token (마스킹 + 표시 토글) 과 만료 시각, 그리고 그대로 붙여넣을 수 있는 CLI 예시가 표시됩니다. 보안 노출을 최소화하려면 토큰 표시 가 아닌 토큰 복사 버튼만 누르고 터미널에 곧장 붙여넣는 것을 권장합니다.

-
터미널에서:
export GEND_API_URL=https://gend.genon.aiexport GEND_TOKEN="<위 다이얼로그에서 복사한 토큰>"gend health# Status: healthy / Trino: connected / PostgreSQL: connected
토큰은 SSO 세션과 같은 만료 시각을 따릅니다 (보통 1 시간). 만료되면 GenD UI 페이지를 새로고침해 자동 갱신된 토큰을 다시 복사하세요. 자동화/CI 는 M2M 서비스 클라이언트를 사용합니다 — gend-cli 빠른 시작 참조.
1. News source 등록 (UI 의 "신규 등록" 과 동일)
공용 수집기 소스는 /api/v1/intel/sources 로 관리합니다 (admin 전용).
curl -sS -X POST "${GEND_API_URL}/api/v1/intel/sources" \
-H "Authorization: Bearer ${GEND_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{
"name": "한경 금융 RSS",
"collector_type": "rss",
"domain": "articles",
"params_json": {"feeds": [{"url": "https://www.hankyung.com/feed/finance", "publisher": "hankyung", "lang": "ko"}]},
"schedule_cron": "30 0 * * *",
"enabled": true
}'
JSON 응답으로 신규 row 의 UUID 와 audit 컬럼이 출력됩니다. UI 페이지를 새로고침하면 동일 row 가 즉시 반영됩니다. 수동 실행은 POST /api/v1/intel/sources/{id}/run.
2. 등록된 source 목록 + 적재 결과 조회
# 소스 목록
curl -sS "${GEND_API_URL}/api/v1/intel/sources" \
-H "Authorization: Bearer ${GEND_TOKEN}" | jq '.items[] | {name, collector_type, domain, last_status}'
# 적재된 기사 SQL 조회 (gend CLI)
gend query exec "SELECT title, published_at FROM gendpg.public.intel_articles \
WHERE source='rss:hankyung' \
ORDER BY published_at DESC LIMIT 3"
gend query exec 는 비동기 endpoint (POST /query/execute → query_id) 와 결과 endpoint (GET /query/{id}/results) 를 자동으로 폴링해 한 번의 호출로 row 까지 출력합니다.
3. CSV / JSON 출력
# CSV (스프레드시트 import 용)
gend query exec --format csv \
"SELECT title, url, published_at FROM gendpg.public.intel_articles LIMIT 50"
AI 어시스턴트로 사용하기
상단바(🤖) 또는 사이드바 공통 핀에서 AI 어시스턴트 드로어를 열고 자연어로 질의할 수 있습니다 (전체 화면 대화는 드로어의 확장 버튼).
질문: gendpg.public.intel_articles 에서 source 가 rss:hankyung 인 뉴스 제목
5개를 published_at 최신순으로 보여줘
에이전트가 카탈로그/쿼리 도구를 호출해 SQL 을 생성·실행하고 결과 표를 반환합니다.
인터페이스 비교
| 인터페이스 | 등록 | 조회 | 적합한 사용자 |
|---|---|---|---|
UI (/admin/intel-sources, /sql-editor) | ✅ (admin) | ✅ | 운영자, 분석가 (시각적) |
REST / CLI (/api/v1/intel/sources, gend query exec) | ✅ (admin) | ✅ | 데이터 엔지니어, 자동화 스크립트 (스크립팅·CI) |
| AI 어시스턴트 (드로어) | — | ✅ | 비기술 사용자 (자연어) |
세 인터페이스 모두 같은 REST API 를 호출 — 권한과 audit 흐름은 동일합니다.
다음 단계 — 분석 SQL 예시
시간대별 발행량
SELECT date_trunc('hour', published_at) AS hour, count(*) AS articles
FROM gendpg.public.intel_articles
WHERE source = 'rss:hankyung'
AND published_at >= current_timestamp - interval '7' day
GROUP BY 1
ORDER BY 1;
가격 시계열과 join (crypto 분봉)
SELECT
n.published_at,
n.title,
o.close - lag(o.close) OVER (ORDER BY o.ts) AS price_delta
FROM gendpg.public.intel_articles n
JOIN iceberg.silver.intel_ohlcv_minute o
ON o.symbol = 'BTC/USDT' AND o.exchange = 'binance'
AND o.ts BETWEEN n.published_at AND n.published_at + interval '5' minute
WHERE n.source = 'rss:hankyung'
AND n.published_at >= current_timestamp - interval '7' day
ORDER BY n.published_at DESC
LIMIT 20;
뉴스 발행 후 5분 동안의 BTC 가격 변동을 본문 옆에 묶을 수 있습니다. cross-catalog join 패턴은 gendpg 운영 가이드 에 더 있습니다.
운영 팁
| 항목 | 권장 |
|---|---|
| robots.txt 확인 | 시작 전 사이트의 /robots.txt 와 약관을 확인 |
| 호출 빈도 | 매일 1회~매시간 권장. 잦은 호출은 IP 차단 위험 |
| Source 분리 | 카테고리별 별도 소스 또는 feeds 항목 분리 (publisher 구분) → SQL 분석 정밀도 ↑ |
| 본문 길이 | RSS 의 summary 는 짧음 (보통 100-300 byte). 전문 본문이 필요하면 RAG 흐름(웹 크롤링) 또는 셀프서비스 rest_source 의 상세 fan-out 검토 |
다른 흐름과의 관계
| 사용 케이스 | 흐름 | 튜토리얼 |
|---|---|---|
| 본문을 RAG / AI Chat 에서 검색 | 파일·문서 수집(웹 크롤링) → SeaweedFS → Vector DB + Document Store | financial-news-rag |
| 뉴스를 정형 SQL 로 분석 (이 페이지) | 공용 수집기 rss → Bronze → Silver(gendpg.public.intel_articles) | (현재) |
| 거래소 OHLCV 등록 | 공용 수집기 ccxt → iceberg.silver.intel_ohlcv_minute | financial-sources |
| 팀 전용 외부 API 수집 (셀프서비스) | 파이프라인 스튜디오 rest_source → intel_bronze_sink | self-service-collection |
두 뉴스 흐름은 동시 사용 가능 — 같은 RSS 를 한쪽은 RAG, 한쪽은 정형 적재로 병행해도 됩니다.
참고
- 코드:
apps/api/src/gend_api/services/collectors/rss_collector.py,apps/api/src/gend_api/routers/intel_source.py - 공용 수집기 화면 상세: 공용 수집기 (관리형)
- 관련 이슈: #2533 (구 자동 수집 화면 은퇴), #1300 (rss 수집기)