# 보안 뉴스 자동 수집 · AI 요약 · Notion 정리 시스템
요구 사항 명세서 (Software Requirements Specification)
## 1. 개요
본 시스템은 BleepingComputer 및 Hacker News에서 보안 관련 뉴스를 자동으로 수집하고,
AI를 활용하여 한국어로 요약한 뒤 Notion 데이터베이스에 구조화하여 저장하는 것을 목표로 한다.
이를 통해 보안 트렌드 파악, 학습 자료 정리, 개인 또는 팀 단위 지식 관리의 효율성을 높인다.
---
## 2. 시스템 목표
- 보안 뉴스 수집의 자동화
- 한국어 중심의 핵심 요약 제공
- Notion을 활용한 일관된 지식 관리
- 반복 실행 가능한 파이프라인 구축
---
## 3. 기능 요구 사항
### 3.1 뉴스 수집 기능
- BleepingComputer의 공식 RSS를 통해 최신 기사 목록을 수집해야 한다.
- Hacker News는 공식 API를 사용하여 게시글 정보를 수집해야 한다.
- 보안 관련 키워드를 기준으로 뉴스 필터링을 수행해야 한다.
- 이미 수집된 기사는 중복 처리되지 않아야 한다.
---
### 3.2 본문 파싱 및 전처리
- 기사 URL에서 본문 텍스트만 추출해야 한다.
- 광고, 스크립트, 불필요한 HTML 요소는 제거해야 한다.
- 요약에 필요한 최소한의 텍스트만 AI에 전달해야 한다.
---
### 3.3 AI 요약 기능
- 모든 뉴스는 한국어로 요약되어야 한다.
- 요약 결과는 다음 정보를 포함해야 한다.
- 사건 또는 이슈 개요
- 영향을 받는 제품 또는 서비스
- 보안 위협 또는 취약점 내용
- 위험도 수준 (Low / Medium / High)
- 간단한 대응 또는 시사점
- 요약 결과는 원문을 그대로 복사하지 않아야 한다.
---
### 3.4 Notion 연동 기능
- Notion API를 사용하여 지정된 데이터베이스에 페이지를 생성해야 한다.
- 각 뉴스는 하나의 페이지로 저장되어야 한다.
- 최소한 다음 속성을 포함해야 한다.
- 제목
- 출처
- 원문 URL
- 한국어 요약
- 위험도
- 태그
- 수집 날짜
---
### 3.5 자동화 기능
- 전체 파이프라인은 스크립트 한 번 실행으로 동작해야 한다.
- 주기적 실행(예: 하루 1회)이 가능해야 한다.
- 실행 중 오류 발생 시 전체 시스템이 중단되지 않아야 한다.
---
## 4. 비기능 요구 사항
### 4.1 성능
- 뉴스 수집부터 Notion 저장까지 기사 1건당 평균 처리 시간은 합리적인 수준이어야 한다.
- 불필요한 API 호출을 최소화해야 한다.
---
### 4.2 보안
- API 키(OpenAI, Notion 등)는 코드에 하드코딩하지 않아야 한다.
- 환경 변수 또는 별도 설정 파일로 관리해야 한다.
---
### 4.3 확장성
- 뉴스 소스는 향후 추가 가능해야 한다.
- 요약 포맷은 수정 및 확장이 가능해야 한다.
---
### 4.4 유지보수성
- 코드 구조는 기능 단위로 분리되어야 한다.
- 로그 또는 실행 결과를 확인할 수 있어야 한다.
---
## 5. 구현 및 사용 방법
- 폴더 구조 개요
- `app/collectors.py`: BleepingComputer RSS, Hacker News 수집기
- `app/parser.py`: 본문 추출 및 전처리
- `app/summarizer.py`: OpenAI API 기반 요약(Dummy 대체 포함)
- `app/notion_client_wrapper.py`: Notion API 연동
- `app/pipeline.py`: 전체 파이프라인 오케스트레이션
- `run.py`: 실행 엔트리포인트
- `config.yaml`: 키워드/소스/요약/Notion 설정
- `.env.example`: 환경 변수 샘플
### 5.1 사전 준비
- Python 3.10+ 권장
- 의존성 설치: `pip install -r requirements.txt`
- `.env.example`를 `.env`로 복사 후 다음 값 설정
- `OPENAI_API_KEY` (선택: 없으면 Dummy 요약 사용)
- `OPENAI_MODEL` (기본값: gpt-4o-mini)
- `NOTION_TOKEN`, `NOTION_DATABASE_ID` (선택: 미설정 시 Notion 저장 생략)
- 필요시 `config.yaml`에서 키워드/소스/Notion 속성 매핑 수정
### 5.2 실행
```
python run.py
```
- 실행 결과 요약(수집/필터/처리/Notion 저장/중복 스킵/에러)을 콘솔에 출력합니다.
- 중복 방지를 위해 `data/seen.json`에 처리된 항목이 저장됩니다
### 5.4 Notion 데이터베이스 스키마 예시
- 속성 이름은 `config.yaml`의 `notion_properties`에 맞추세요
- `Title`(title), `Source`(select), `URL`(url), `Summary`(rich_text), `Risk`(select), `Tags`(multi_select), `Collected`(date)
- `Source`, `Risk`의 select 옵션(High/Medium/Low 등)은 사전에 데이터베이스에서 생성해 두면 좋습니다.
### 5.5 주의 사항
- 네트워크 및 외부 API 호출 실패 시 해당 항목만 건너뛰고 파이프라인은 계속 진행합니다.
- OpenAI/Notion 키를 코드에 하드코딩하지 않고 환경 변수로만 사용합니다.
- 뉴스 소스 추가 및 요약 포맷 변경은 `config.yaml`과 해당 모듈을 확장하여 반영할 수 있습니다.