Synthèse automatique
Guide complet pour construire un bot de curation de nouvelles financières et de recherche d'investissement, couvrant l'architecture multi-service, les modèles de codage et les pratiques de sécurité.
Points forts
- Architecture détaillée avec séparation claire des services (frontend, API, AI, data)
- Directives de codage précises pour chaque couche (Spring Boot, Node.js, Next.js)
- Modèles de gestion d'erreurs et de sécurité prêts à l'emploi
- Stratégie de test et de déploiement incluse
Limites
- Spécifique au domaine financier, nécessite des adaptations pour d'autres secteurs
- Mise en œuvre lourde pour des besoins simples de curation
- Dépend de services externes (Perplexity, Claude API, KakaoTalk) qui peuvent avoir des coûts
Lorsque vous souhaitez développer un outil personnel de veille financière automatisé avec classification IA et notifications via KakaoTalk.
Si vous avez besoin d'une solution simple de type lecteur RSS ou que vous ne souhaitez pas gérer une architecture multi-service complexe.
Analyse de sécurité
SûrThis is a documentation file describing a project architecture and development guidelines. It contains no executable commands, destructive actions, or data exfiltration instructions. It's purely informational and poses no security risk.
Aucun point d'attention détecté
Comment cette analyse est faiteExemples
I want to build a personal financial news curation bot with AI summarization and KakaoTalk notifications. Please provide the high-level architecture and component breakdown as described in the Finance Bot guide.Set up the project structure for a multi-service finance bot with Spring Boot API, Node.js AI service, and Next.js frontend. Include the directory structure and key configuration files.Implement a news classification service using Claude API that takes a URL, scrapes the content, classifies it, and returns a summary. Follow the coding patterns from the Finance Bot skill.Finance Bot - 프로젝트 컨텍스트 & 개발 가이드
프로젝트 개요
- 이름: 금융 뉴스 스크랩 및 투자 리서치 자동화 봇
- 목적: 개인용 금융 뉴스 큐레이션 + 아카이빙 도구
- 핵심 기능: 자동 수집(Perplexity) + 수동 URL 등록(Claude 분류) + 카카오톡 알림
기술 스택 전체 맵
Frontend: Next.js 15 (App Router), TypeScript, Tailwind CSS + shadcn/ui, Zustand
api-server: Spring Boot 3.x (Java 17), JPA, Supabase(PostgreSQL 15), Redis
ai-service: Node.js (Express), claude.service.js, perplexity.service.js, kakao.service.js
data-service: FastAPI (Python), pandas (Level 2 이후)
자동화: n8n (매일 07:00 KST 스케줄러)
배포: Vercel(FE), Railway(api-server + ai-service), n8n Cloud
서비스별 역할
| 서비스 | 기술 | 역할 | |--------|------|------| | api-server | Spring Boot 3.x | 핵심 CRUD API (종목, 뉴스 아카이브, 발송 이력) | | ai-service | Node.js (Express) | AI 오케스트레이터 (Perplexity, Claude, 카카오톡 연동) | | data-service | FastAPI (Python) | 데이터 분석 (Level 2 이후 확장 대비) |
도메인 구조 (Spring Boot api-server)
com.financebot.apiserver/
├── domain/
│ ├── stock/ # 관심 종목 관리 (StockController, StockService, StockRepository)
│ ├── news/ # 뉴스 아카이브 (NewsArticle, NewsSummary)
│ └── notification/ # 발송 이력 (NotificationLog)
├── infra/
│ └── client/ # ai-service WebClient
└── global/
├── exception/ # GlobalExceptionHandler, CustomException
└── response/ # ApiResponse<T> 공통 응답
Node.js ai-service 구조
src/
├── services/
│ ├── claude.service.js # Claude API (뉴스 분류/요약) - Haiku 모델
│ ├── perplexity.service.js # Perplexity API (자동 수집)
│ └── kakao.service.js # 카카오톡 REST API
├── routes/ # Express 라우터
├── controllers/
└── middleware/
└── internalAuth.js # X-Internal-Secret 헤더 인증
코딩 가이드라인
- 주석: 한국어 필수 (복잡한 비즈니스 로직)
- 들여쓰기: 2 spaces
- 변수/함수: camelCase
- 클래스/컴포넌트: PascalCase
- 상수: UPPER_SNAKE_CASE
- TypeScript:
any사용 금지, Strict Mode - 에러 처리: try-catch에서 적절한 에러 응답 반환 (단순 로그만 금지)
- DTO 패턴: 모든 API 요청/응답에 DTO 필수 사용
서비스별 코딩 패턴
Spring Boot api-server
// 생성자 주입 방식 필수 (필드 주입 금지)
@Service
@RequiredArgsConstructor
public class StockService {
private final StockRepository stockRepository;
// 서비스 레이어에서 @Transactional 관리
@Transactional
public StockResponse create(StockCreateRequest request) { ... }
// 소프트 삭제 패턴 (is_active = false)
@Transactional
public void deactivate(Long id) { ... }
}
// ApiResponse<T> 공통 응답 형식
@RestController
public class StockController {
@PostMapping
public ResponseEntity<ApiResponse<StockResponse>> create(...) {
return ResponseEntity.status(201).body(ApiResponse.success(response));
}
}
Node.js ai-service
// 서비스 레이어에서 비즈니스 로직 집중
// 에러는 적절한 HTTP 상태코드와 함께 반환
const classifyNews = async (url) => {
try {
// axios + cheerio로 크롤링
// Claude API 호출 → JSON 파싱
// Redis 중복 체크
} catch (error) {
// 단순 console.error만 하지 말고 에러 전파
throw new AppError('분류 실패', 500, error.message);
}
};
Next.js Frontend
// Server Component 우선 (데이터 패칭은 서버에서)
// Client Component는 interactivity 필요 시만 ('use client')
// Zustand 스토어: 클라이언트 상태만 관리
// React Hook Form + Zod: 폼 검증
// API 호출은 별도 lib/api.ts에 집중
export const fetchStocks = async (): Promise<Stock[]> => {
const res = await fetch(`${API_BASE_URL}/api/v1/stocks`);
if (!res.ok) throw new Error('종목 조회 실패');
return res.json();
};
테스트 전략
| 서비스 | 테스트 도구 | 우선순위 | |--------|------------|---------| | api-server | JUnit 5 + MockMvc | Service 레이어 단위 테스트 | | ai-service | Jest | Service 함수 단위 테스트, API 응답 모킹 | | frontend | N/A (MVP 단계) | - |
에러 처리 패턴
api-server: GlobalExceptionHandler → ApiResponse<T> 형태로 통일
ai-service: AppError 클래스 → Express error middleware → JSON 에러 응답
frontend: try-catch + 사용자 친화적 에러 메시지 (toast/alert)
보안 패턴
- 서비스 간 통신:
X-Internal-Secret헤더 필수 (ai-service → api-server) - 환경변수:
.env파일 절대 커밋 금지,.env.example만 커밋 - API 키: 모두 환경변수로 관리 (CLAUDE_API_KEY, PERPLEXITY_API_KEY 등)
작업 완료 프로토콜 (MANDATORY)
모든 작업이 완료된 후 반드시 아래 순서를 따릅니다.
1단계: 문서 업데이트
다음 파일들을 작업 내용에 맞게 업데이트 (버전 관리 필수):
| 파일 | 업데이트 조건 |
|------|------------|
| docs/PRD/PRD.md | 기능 추가/변경 시 버전 증가 |
| docs/db/ERD.md | DB 스키마 변경 시 |
| docs/api/backend/api-spec.md | api-server API 변경 시 |
| docs/api/ai/api-spec.md | ai-service API 변경 시 |
| docs/api/frontend/api-spec.md | 프론트엔드 API 호출 변경 시 |
| docs/features/ai/auto-collection.md | AI 수집 기능 변경 시 |
| docs/features/ai/notification.md | 알림 기능 변경 시 |
| docs/features/user/news-archive.md | 뉴스 아카이브 기능 변경 시 |
| docs/features/user/news-registration.md | 수동 등록 기능 변경 시 |
| docs/features/user/stock-management.md | 종목 관리 기능 변경 시 |
2단계: README 업데이트
README.md(루트): 개발 진행 현황 체크리스트 업데이트- 변경된 서비스 폴더의
README.md업데이트
3단계: Velog 초안 업데이트
docs/velog/*.md 중 해당 브랜치와 연계된 포스팅 초안에 내용 추가
.claude/velog.md의 "브랜치 → Velog 연계 맵" 참조
4단계: Git 작업
# 변경사항 커밋
git add <변경된 파일들>
git commit -m "feat: 작업 내용 요약"
# 브랜치 push 및 PR 생성
git push -u origin <브랜치명>
gh pr create --base develop --title "[서비스] 작업 내용" --body "..."
컨텍스트 관리 전략 (Auto-Compact)
언제 compact가 필요한가
- 대화가 길어져 컨텍스트 윈도우가 가득 찰 때 자동으로 compact 실행
- 작업 중단 없이 연속적으로 진행 가능
Memory 파일 관리 원칙
- 중요 결정사항은 즉시
memory/MEMORY.md에 기록 - 세션 종료 전 아래를 확인:
- 완료된 작업 →
MEMORY.md의 진행 상태 업데이트 - 새로운 파일 위치 →
핵심 파일 위치섹션에 추가 - 새로운 설계 결정 →
주요 설계 결정섹션에 추가
- 완료된 작업 →
- 상세 기술 노트가 필요한 경우
memory/하위에 별도 파일 생성 후 MEMORY.md에 링크
효율적 컨텍스트 사용
- 작업 시작 시 반드시
MEMORY.md확인하여 이전 작업 이어받기 - 대규모 파일 읽기 시 필요한 섹션만 선택적으로 읽기 (offset/limit 활용)
- 반복적인 전체 파일 읽기 대신 특정 패턴 검색(Grep) 활용
실행 명령어
# 로컬 인프라
docker-compose up -d # PostgreSQL(로컬) + Redis
# api-server
cd api-server && ./gradlew bootRun --args='--spring.profiles.active=local'
# ai-service
cd ai-service && npm run start:dev
# frontend
cd frontend && npm run dev
# 테스트
cd api-server && ./gradlew test
cd ai-service && npm test
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/finance-bot-project-guide-mrx3xzhp/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/finance-bot-project-guide-mrx3xzhp' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/finance-bot-project-guide-mrx3xzhp/download' --output '.skill-downloads/finance-bot-project-guide-mrx3xzhp/SKILL.md.part' && mv '.skill-downloads/finance-bot-project-guide-mrx3xzhp/SKILL.md.part' '.skill-downloads/finance-bot-project-guide-mrx3xzhp/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Le fichier ne fournit pas un en-tête name/description exploitable pour cette procédure native. Le téléchargement reste disponible pour lecture ; utilisez le mode manuel ci-dessous.
Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/finance-bot-project-guide-mrx3xzhp/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.