본문으로 건너뛰기

금융 뉴스 정형 적재

이 튜토리얼은 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 역할 (Keycloak gend realm) — 공용 수집기 등록은 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_jsonfeeds 배열을 받습니다. 각 피드는 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;

Trino SELECT 결과

실제 기사 제목과 URL, UTC 발행 시각이 그대로 들어와 있으면 성공입니다. gendpg 는 read-only 카탈로그이며 인증/감사 계열 테이블은 403 으로 차단됩니다 — 자세한 내용은 Silver PG → Trino Catalog (gendpg) 운영 가이드 참조.

REST API / CLI 로 사용하기

UI 의 등록/조회 흐름은 REST API 와 gend CLI 로 동일하게 수행할 수 있습니다.

0. 토큰 발급 + 환경변수 설정

GenD 에 이미 SSO 로그인한 사용자라면 우상단 사용자 메뉴에서 한 번의 클릭으로 현재 세션 토큰을 복사할 수 있습니다.

UI 흐름 (권장)

  1. https://gend.genon.ai 우상단 아바타 → 드롭다운에 API 토큰 메뉴가 노출됩니다.

    사용자 메뉴 — API 토큰

  2. 클릭하면 다이얼로그가 열리고 현재 세션의 access_token (마스킹 + 표시 토글) 과 만료 시각, 그리고 그대로 붙여넣을 수 있는 CLI 예시가 표시됩니다. 보안 노출을 최소화하려면 토큰 표시 가 아닌 토큰 복사 버튼만 누르고 터미널에 곧장 붙여넣는 것을 권장합니다.

    API 토큰 다이얼로그

  3. 터미널에서:

    export GEND_API_URL=https://gend.genon.ai
    export 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/executequery_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 Storefinancial-news-rag
뉴스를 정형 SQL 로 분석 (이 페이지)공용 수집기 rss → Bronze → Silver(gendpg.public.intel_articles)(현재)
거래소 OHLCV 등록공용 수집기 ccxt → iceberg.silver.intel_ohlcv_minutefinancial-sources
팀 전용 외부 API 수집 (셀프서비스)파이프라인 스튜디오 rest_source → intel_bronze_sinkself-service-collection

두 뉴스 흐름은 동시 사용 가능 — 같은 RSS 를 한쪽은 RAG, 한쪽은 정형 적재로 병행해도 됩니다.

참고