diff --git a/week-5/images/dart_main.png b/week-5/images/dart_main.png new file mode 100644 index 0000000..2bad639 Binary files /dev/null and b/week-5/images/dart_main.png differ diff --git a/week-5/images/kakaopay_sec_main.png b/week-5/images/kakaopay_sec_main.png new file mode 100644 index 0000000..84398ba Binary files /dev/null and b/week-5/images/kakaopay_sec_main.png differ diff --git a/week-5/images/toss_samsung_disclosure.png b/week-5/images/toss_samsung_disclosure.png new file mode 100644 index 0000000..0898caf Binary files /dev/null and b/week-5/images/toss_samsung_disclosure.png differ diff --git a/week-5/images/toss_samsung_main.png b/week-5/images/toss_samsung_main.png new file mode 100644 index 0000000..1e35f58 Binary files /dev/null and b/week-5/images/toss_samsung_main.png differ diff --git a/week-5/shmoon.md b/week-5/shmoon.md new file mode 100644 index 0000000..d1b525a --- /dev/null +++ b/week-5/shmoon.md @@ -0,0 +1,324 @@ +# 5주차: PRD v2 — 공시·실적 분석 웹 서비스 "DARTshot" + +> **한 줄 요약**: 개인 투자자가 종목명만 입력하면 DART 공시와 분기 실적을 30초 안에 카드로 확인할 수 있는 웹 서비스. 저작권 리스크 없는 공식 OpenAPI 기반, 브라우저 종류 무관. + +> **v1 → v2 변경 핵심**: v1은 네이버 금융 내부 기능 개선 제안(증권사 PDF 파싱)이었으나, **3가지 구조적 한계**로 v2에서 독립 웹 서비스로 전환. +> 1. **저작권 리스크**: PDF 파싱=저작물 복제, DB권(저작권법 91조), 계약 위반 가능성 — MVP 전에 법무 검토가 필수 게이트가 됨 +> 2. **내부 의존**: 네이버가 만들어야 하는 기능이라 외부에서 가설 검증 불가 +> 3. **KPI 측정 불가**: "PDF 미클릭 이탈률"은 네이버 내부 데이터 없이 측정 불가 +> +> → 같은 문제(정보 접근 비용 과다)를 **저작권 리스크 0, 직접 측정 가능한 KPI, 즉시 구현 가능**한 방식으로 재설계. + +## 분석 대상 + +- **서비스**: DARTshot (신규 웹 서비스) +- **URL**: dartshot.kr (가칭) +- **해결하는 페인포인트**: 개인 투자자가 종목 분석 시 공시·실적 확인을 위해 DART 사이트, 네이버 금융, 증권사 앱을 오가며 겪는 정보 수집 비용 과다 + +--- + +## v1 회고 및 변경 이유 + +### v1에서 잘 정의된 것 +- 문제 정의: "PDF 없이 30초 안에 핵심 파악" — 여전히 유효 +- Before/After 시나리오: 박민준의 PDF 탐색 → 이탈 흐름 +- ICE Score 구조와 Scope 분리 방식 +- 저작권 리스크 3가지 분리 (PDF 파싱=복제, DB권, 계약 위반) + +### v1의 핵심 약점 +1. **저작권 리스크가 MVP 게이트**: 법무 검토 통과 전까지 MVP를 만들 수 없는 구조. "리스크 완화"가 아니라 "실행 차단" +2. **네이버 내부 의존**: 외부에서 가설 검증 불가 — 유저 반응을 직접 볼 방법이 없음 +3. **KPI 측정 불가**: "PDF 미클릭 이탈률"은 네이버 내부 로그 없이 볼 수 없는 지표 + +### v2 전환 논리 (Chrome Extension이 아닌 웹 서비스를 선택한 이유) + +Extension 대신 웹 서비스를 선택한 이유는 **접근성과 안정성** 두 가지다. + +| 비교 항목 | Chrome Extension | 웹 서비스 (v2 선택) | +|-----------|-----------------|-------------------| +| 지원 브라우저 | Chrome 전용 | 모든 브라우저 | +| 네이버 DOM 의존 | 있음 (UI 개편 시 즉시 파손) | 없음 | +| 설치 마찰 | 스토어 설치 필요 | URL 접속 즉시 사용 | +| KPI 측정 | 스토어 통계 + 로그 분리 | 단일 웹 애널리틱스로 통합 | +| SEO / 바이럴 | 없음 | 검색 유입, URL 공유 가능 | + +> 결론: Extension은 "기존 사이트에 붙어사는" 구조여서 호스트 사이트(네이버)가 바뀌면 깨진다. 웹 서비스는 독립적으로 존재하며 사용자가 직접 목적지로 방문한다. 동일한 DART OpenAPI를 쓰되 더 안정적이고 넓은 사용자에게 도달할 수 있는 형태. + +--- + +## 1. 배경 및 문제 정의 (Why) + +### 문제 상황 + +개인 투자자가 종목 투자 결정 전 거치는 정보 수집 루틴: + +``` +네이버 금융 종목 검색 +→ 실적 확인하러 DART 이동 (사이트 전환 1) +→ 기업 코드 검색 → 사업보고서 찾기 → PDF 열기 +→ 공시 확인하러 다시 DART 메인 (사이트 전환 2) +→ 종목명으로 공시 검색 → 원문 확인 +→ 다시 네이버 금융으로 복귀 +``` + +이 루틴에서 발생하는 비용: +1. **탭 전환 비용**: 평균 3~5개 탭을 오가며 정보 수집 +2. **DART UX 난이도**: DART 사이트는 기업 코드 기반 검색 구조 — 종목명으로 직접 검색이 안 됨 +3. **공시 해석 비용**: 원문이 길고 핵심이 어디 있는지 파악하기 어려움 +4. **실시간성 부재**: 공시가 올라와도 능동적으로 확인하지 않으면 인지 불가 + +### 영향받는 사용자 + +- **핵심 타겟**: 실적 발표 시즌에 종목 분석을 직접 하는 개인 투자자 +- **세그먼트**: 투자 경험 1년 이상, 실적 발표 시즌 주 3회 이상 종목 정보 탐색 +- **규모 추정**: 네이버 금융 월간 방문자 약 1,500만 명 중 실적·공시 탭 진입 추정 10~15% → 약 150~225만 명 + +### 근거 + +**앱 리뷰·커뮤니티 분석 (v1 3주차 인용)**: +- "DART 들어가서 찾는 게 너무 복잡해서 결국 유튜브로 대체한다" +- "실적 발표 날 공시 뜨는 거 바로 알고 싶은데 방법이 없다" + +**벤치마킹 — 유사 서비스 현황**: + +| 서비스 | 형태 | 공시 기능 | 실적 분석 | 한계 | +|--------|------|-----------|-----------|------| +| [토스증권](https://www.tossinvest.com/stocks/A005930/news?menu=disclosure) | MTS 앱+웹 | 공시 탭 있음 (DART 연동) | 수치 나열만 | 공시 클릭 시 DART 외부 이동, 증감률 자동 계산 없음, 로그인 필수 | +| [카카오페이증권](https://kakaopaysec.com) | MTS 앱 전용 | KIND 외부 링크 수준 | 미흡 | 종목 페이지 앱 전용, 웹 브라우저 접근 불가 | +| [DART 공식 사이트](https://dart.fss.or.kr/dsab007/main.do) | 웹 | 전체 공시 원문 | 없음 | 기업 코드 기반 검색, UX 난이도 높음, 실적 계산 없음 | +| 에프앤가이드 | 웹 | 있음 | 기관급 | 월 수십만 원 유료, 개인 투자자 접근 불가 | + +**결론**: 토스증권·카카오페이증권 모두 공시를 보려면 앱 설치·로그인이 필수이고, 공시 원문을 외부로 넘기는 수준에 그침. **종목명 검색 하나로 실적 증감률 자동 계산 + 공시 분류까지 제공하는 독립 웹 서비스**는 현재 존재하지 않음. 명확한 공백. + +**데이터 소스 선택 근거 — DART OpenAPI**: +- 금융감독원 전자공시시스템 공식 API +- 무료 (API 키 발급만으로 사용 가능) +- 저작권 리스크 0: 공공기관이 제공하는 공시 데이터, 재배포 허용 +- 정형화된 JSON 응답 — 파싱 실패 리스크 없음 + +### 방치하면 생기는 비즈니스 영향 + +- 정보 수집 비용이 높은 개인 투자자는 유료 서비스(FnGuide, 에프앤가이드)로 이탈 +- 실적 발표 직후 정보 격차 → 개인 투자자의 의사결정 품질 저하 +- 한국판 Bloomberg Terminal 수준의 공시 정보를 무료로 제공하는 서비스 공백 지속 + +--- + +## 2. 목표와 성공 지표 (What + KPI) + +### 목표 (Goal) + +> 개인 투자자가 DARTshot에서 종목명을 입력하면, DART 사이트나 PDF 없이 30초 안에 최근 실적 트렌드와 주요 공시를 파악할 수 있게 한다. + +### 성공 지표 (KPI) + +| 지표 | 카테고리 | 현재 | 목표 (출시 4주 후) | +|------|---------|------|------------------| +| 주간 활성 사용자(WAU) | Adoption | 0 | 500+ | +| 세션당 종목 조회 수 | Engagement | - | 평균 2개 이상 | +| 7일 재방문율 | Retention | - | 35% 이상 | +| 검색 후 공시 원문 클릭률 | Task Success | - | 40% 이상 | +| NPS (만족도) | Happiness | - | 30 이상 | + +**핵심 지표**: **7일 재방문율 35% 이상** + +WAU는 마케팅으로 올릴 수 있지만 재방문율은 제품의 실제 가치를 반영한다. 투자자가 실적 발표 시즌마다, 또는 보유 종목 공시가 날 때 "DARTshot부터 확인"하는 습관이 생기면 재방문율이 올라간다. 이 지표가 곧 "습관형 도구"로 자리잡았는지의 신호. + +--- + +## 3. 사용자 경험 변화 (Before → After) + +### Before (현재) + +박민준(32세, 직장인 투자자)은 삼성전자 실적 발표 다음 날 네이버 금융에서 삼성전자를 검색한다. + +실적이 궁금하다. 분기 매출·영업이익은 있지만 전년 동기 대비 증감률이 없다. "직접 계산해야 하나?" DART로 이동한다. DART 메인에서 삼성전자를 검색한다. 기업 코드가 필요하다. 다시 찾는다. 사업보고서를 연다. 100페이지짜리 PDF다. Ctrl+F로 "영업이익"을 검색한다. 숫자를 찾아 지난 분기와 비교한다. + +공시도 확인하고 싶다. DART에서 최근 공시 목록을 본다. 10개 중 뭐가 중요한지 모른다. "주요사항보고서"를 클릭한다. 원문을 읽는다. 5분이 지났다. + +박민준은 결국 유튜브에서 "삼성전자 실적 정리" 영상을 찾아본다. + +### After (개선 후) + +박민준은 dartshot.kr에서 "삼성전자"를 입력한다. Enter를 누르는 순간 결과가 나온다. + +``` +삼성전자 (005930) + +📊 실적 요약 (2024 Q4) +───────────────────────────────────── +매출 79.1조 QoQ +12% YoY +8% +영업이익 6.5조 QoQ +130% YoY 흑자전환 +───────────────────────────────────── +최근 4분기 추이: ▼ ▼ ▲ ▲ (회복세) + +📋 최근 공시 (최신 5건) +───────────────────────────────────── +[주요] 자기주식 취득 결정 3시간 전 +[일반] 분기보고서 제출 어제 +[주의] 최대주주 지분 매각 2일 전 +[일반] 임원 소유 주식 변동 3일 전 +[일반] 기업설명회 개최 5일 전 +───────────────────────────────────── +``` + +박민준은 30초 만에 핵심을 파악한다. "서프라이즈 났고, 자사주 매입도 했네. 최대주주 매각은 확인해봐야겠다." 공시 원문이 궁금하면 해당 줄을 클릭하면 DART 원문으로 바로 이동한다. + +설치도 없고, Chrome도 필요 없다. 북마크 하나로 끝. + +--- + +## 4. 솔루션 접근법 (How - 개괄) + +### 접근 방식 + +> **DART OpenAPI(무료·공식)로 실적·공시 데이터를 가져와, 종목명 검색 하나로 핵심을 카드 형태로 보여주는 웹 서비스. 저작권 리스크 0, 설치 없음, 모든 브라우저 지원.** + +### 핵심 아이디어 + +1. **종목 검색 인터페이스**: 종목명 또는 종목코드 입력 → 자동완성 → 결과 즉시 표시 +2. **실적 카드**: DART `fnlttSinglAcntAll` API → 최근 4분기 매출·영업이익 + QoQ/YoY 증감률 자동 계산 + 추이 시각화 +3. **공시 카드**: DART `list` API → 최신 공시 5건 + 유형 분류(주요/일반/주의) 표시 +4. **원문 직행 링크**: 공시 클릭 시 DART 원문 URL로 직행 + +### 기술 스택 + +``` +Frontend: React (Vite) — 검색 UI + 카드 렌더링 +Backend: Node.js (Express) — DART API 프록시 + 기업코드 매핑 + └── DART OpenAPI 호출 (CORS 해결 + API 키 서버 관리) + └── 인메모리 캐싱 (동일 종목 반복 조회 최적화) +Hosting: Vercel (Frontend) + Railway (Backend) +``` + +### 기술적 고려사항 + +- **DART API 프록시**: 브라우저에서 직접 DART API 호출 시 CORS 에러 발생 → 백엔드에서 프록시 처리. API 키를 서버에서만 관리해 클라이언트 노출 방지 +- **기업코드 매핑**: 코스피·코스닥 전 종목 기업코드 매핑 JSON을 백엔드에 정적 번들링 (DART에서 일괄 다운로드 가능, 월 1회 업데이트) +- **캐싱**: 동일 종목 조회 시 API 재호출 방지 → 실적 데이터는 분기별 갱신이므로 1시간 캐시, 공시는 30분 캐시 +- **API 한도**: DART OpenAPI 일 10,000건 → 초기 서비스 규모에서는 충분. WAU 500 기준 일 1,000~2,000건 추정 + +--- + +## 5. ICE Score + +| 후보 기능 | 설명 | Impact | Confidence | Ease | ICE Score | 판단 | +|-----------|------|-------:|----------:|-----:|----------:|------| +| A. 실적 요약 카드 | 최근 4분기 매출·영업이익 + QoQ/YoY 증감률 | 9 | 8 | 7 | 504 | MVP 채택 | +| B. 공시 분류 카드 | 최신 공시 5건 + 유형별 분류(주요/일반/주의) | 8 | 7 | 7 | 392 | MVP 채택 | +| C. 실적 서프라이즈 감지 | 컨센서스 대비 실제 실적 괴리율 | 9 | 4 | 4 | 144 | V1 후보 | +| D. 공시 자연어 요약 | LLM으로 공시 원문 3줄 요약 | 8 | 6 | 5 | 240 | V1 후보 | +| E. 목표주가 컨센서스 | 증권사 평균 목표주가 표시 | 7 | 3 | 2 | 42 | 보류 | + +### 선택한 아이디어 + +**A + B를 MVP로 함께 채택한다.** + +- **A-Impact 9**: 실적 증감률은 투자자가 가장 먼저 확인하는 정보. 이걸 자동 계산해서 보여주는 것만으로도 탭 전환 3~4회를 대체. Confidence 8인 이유: DART `fnlttSinglAcntAll` API가 정형화된 재무 데이터를 JSON으로 제공 — 파싱 실패 리스크가 거의 없음. Ease 7인 이유: API 호출 + 증감률 계산 + 카드 렌더링으로 복잡한 로직이 없음. + +- **B-Impact 8**: 공시는 실적보다 실시간성이 중요. 오늘 올라온 공시를 종목 검색 하나로 보는 것 자체가 차별점. Confidence 7인 이유: 공시 유형 코드(예: A001=사업보고서, C001=자기주식취득)가 DART에 정의되어 있어 규칙 기반 분류 가능. 단, 분류 정확도는 검증 필요. Ease 7인 이유: `list` API + 유형 코드 매핑 테이블. A보다 단순. + +### 선택하지 않은 아이디어 + +- **C (서프라이즈 감지)**: 컨센서스 데이터를 안정적으로 가져올 소스가 불확실. 에프앤가이드 등은 유료 API. V1에서 소스 확정 후 추가. +- **D (자연어 요약)**: LLM API 호출 비용 + 레이턴시 이슈. MVP에서는 규칙 기반으로 시작하고 V1에서 붙임. +- **E (목표주가 컨센서스)**: 증권사 리포트 데이터 소스 문제 — v1의 저작권 이슈 재발. DART OpenAPI에는 목표주가 데이터 없음. 보류. + +--- + +## 6. 범위와 우선순위 (Scope) + +| 범위 | 내용 | +|------|------| +| **MVP** | 종목명 검색 → 실적 요약 카드(A) + 공시 분류 카드(B). DART OpenAPI 기반. 백엔드 프록시 포함. 데모 URL 배포 가능 | +| **V1** | 실적 서프라이즈 감지(C) — 컨센서스 소스 확정 후. 공시 자연어 요약(D) — LLM 연동. 종목 즐겨찾기 + 로컬 저장 | +| **V2** | 관심 종목 등록 → 공시 알림 이메일/푸시. 실적 트렌드 차트(8분기). 모바일 최적화 | +| **Out of Scope** | 목표주가 컨센서스(저작권·데이터 소스 미확보), 매수/매도 추천, 포트폴리오 관리, 해외 종목 | + +**MVP를 작게 쪼갠 이유**: 실적 + 공시 카드 두 개만으로도 "DART 없이 30초 확인" 가설을 검증할 수 있다. 자연어 요약과 알림은 핵심 가치 검증 이후 붙이는 게 순서에 맞다. + +--- + +## 7. 리스크와 대안 (Risks) + +### 리스크 1: DART API 호출 한도 초과 + +- **시나리오**: DART OpenAPI는 일 10,000건 호출 제한. WAU가 빠르게 성장하면 공유 API 키로는 감당 불가. +- **완화**: + 1. 실적 데이터는 분기별 갱신이므로 1시간 캐시 적용 → 반복 조회 시 API 미호출 + 2. 공시는 30분 캐시. 동일 종목 조회가 집중되는 실적 발표 시즌에 효과적 + 3. 한도 초과 임박 시 속도 제한(Rate limiting) 적용 → 사용자에게 안내 메시지 표시 + 4. 트래픽이 급증하면 DART에 API 한도 상향 협의 또는 다중 API 키 발급 검토 + +### 리스크 2: 공시 분류 오류로 신뢰도 하락 + +- **시나리오**: 규칙 기반 분류가 맥락을 놓쳐 "주요"로 표시된 공시가 실제로는 중요하지 않거나, 반대로 "일반"으로 표시된 공시가 주가에 큰 영향을 미치는 경우 → 투자 판단 오류 유발. +- **완화**: + 1. MVP에서는 분류를 "단순 유형 레이블"로만 표시(예: "자기주식 취득", "유상증자"). 호재/악재 판단은 V1 자연어 요약 도입 후에만 적용 + 2. 항상 "투자 결정 전 원문 확인을 권장합니다" 문구 + 원문 링크 노출 + 3. 분류 기준을 FAQ/도움말로 공개 → 사용자 신뢰 유지 + +### 리스크 3: DART OpenAPI 구조 변경 또는 서비스 중단 + +- **시나리오**: 금융감독원이 DART OpenAPI 스펙을 변경하거나 일시 중단하면 서비스 전체가 영향을 받음. +- **완화**: + 1. API 응답 스키마 변경 감지 모니터링 설정 + 2. 핵심 필드(매출, 영업이익, 공시 유형)에 대해 폴백 파싱 로직 유지 + 3. DART 공지 채널 구독 → 변경 사전 공지 대응 + 4. 서비스 중단 시 "현재 DART 데이터를 가져올 수 없습니다 — DART 사이트 바로가기" 안내 + +### 리스크 4: 실적 데이터 오류로 투자 판단 오류 + +- **시나리오**: 증감률 계산 오류, 단위 오류(억/조 혼재), 연결/별도 기준 혼용으로 잘못된 수치가 표시되어 사용자가 이를 기반으로 투자 판단. +- **완화**: + 1. 단위 표준화 로직을 명시적으로 구현하고 테스트 케이스 작성 (삼성전자, 카카오 등 규모 차이가 큰 종목으로 검증) + 2. 연결재무제표 기준을 기본값으로 명시 표시 + 3. "본 서비스는 DART 공시 데이터를 가공 없이 표시합니다. 투자 책임은 사용자 본인에게 있습니다" 면책 문구 노출 + +--- + +## 8. 열린 질문 (Open Questions) + +- **컨센서스 데이터 소스**: 실적 서프라이즈 감지(C)를 V1에서 구현하려면 컨센서스 추정치가 필요. 네이버 금융 DOM 파싱 vs 에프앤가이드 유료 API vs 직접 수집 중 어떤 방향이 현실적인가? +- **공시 분류 기준 공개 수준**: 주요/일반/주의 분류 기준을 어디까지 투명하게 공개해야 신뢰도를 유지할 수 있는가? 기준 공개가 오히려 "이 분류를 믿으면 안 된다"는 신호가 될 수 있는가? +- **DART 트래픽 기여 포지셔닝**: 공시 원문 클릭 → DART 이동 구조는 DART 트래픽을 늘려주는 형태. 금융감독원 또는 DART 측에서 이를 긍정적으로 볼 경우 API 한도 상향이나 공식 파트너십이 가능한가? +- **모바일 최적화 우선순위**: 투자자의 실적 확인 행동이 데스크탑보다 모바일에서 더 많이 발생한다면, MVP 단계부터 반응형 설계를 넣어야 하는가? +- **수익화 모델**: 무료 서비스로 시작하되, WAU가 일정 수준에 도달하면 어떤 수익화 방향이 사용자 경험과 충돌 없이 가능한가? (광고, 프리미엄 기능, 데이터 API 판매 등) + +--- + +## 참고 자료 및 벤치마킹 + +**벤치마킹한 서비스:** + +**[토스증권](https://www.tossinvest.com/stocks/A005930/news?menu=disclosure)** + +![토스증권 공시 탭](images/toss_samsung_disclosure.png) + +종목 페이지에 공시 탭이 있고 DART와 연동되어 있음. 그러나 실제로 접속하면 두 가지 문제가 확인된다. 첫째, 호가·실적 등 핵심 데이터를 보려면 로그인이 필수("호가를 보려면 로그인이 필요해요" 문구 노출). 둘째, 공시 목록은 보이지만 각 공시 클릭 시 "DART로 원문 보기" 버튼으로 외부 이동하는 구조 — 탭 전환 문제가 그대로 남아 있음. 실적 증감률(QoQ/YoY) 자동 계산 없음. + +DARTshot의 차별점: 로그인·설치 없이 즉시, 증감률 자동 계산, 공시 분류 + 원문 직행 링크. + +--- + +**[카카오페이증권](https://kakaopaysec.com)** + +![카카오페이증권 메인](images/kakaopay_sec_main.png) + +웹 접속 시 "계좌 개설" 랜딩 페이지만 노출됨. 종목 분석·공시·실적 기능은 앱 전용으로 웹 브라우저에서 접근 불가. "한국판 블룸버그"를 표방하지만 웹에서는 마케팅 페이지 외에 아무것도 볼 수 없음. + +DARTshot의 차별점: 앱 설치 없이 URL 하나로 즉시 접근. + +--- + +**[DART 공식 사이트](https://dart.fss.or.kr/dsab007/main.do)** + +![DART 공시통합검색](images/dart_main.png) + +모든 공시 원문의 최종 소스이지만, 검색 UI가 복잡하고 기업명·코드·보고서 유형을 각각 설정해야 원하는 공시에 도달할 수 있음. 실적 계산 기능 없음. DARTshot은 DART를 대체하는 게 아니라 DART로의 진입 비용을 낮추는 레이어 — 공시 클릭 시 DART 원문으로 직행하는 구조로 DART 트래픽에 기여. + +**참고 자료 감상평:** + +[모두가 알지만 누구도 제대로 쓰지 못하는, PRD — yozm](https://yozm.wishket.com/magazine/detail/2826/) + +> "요구사항의 주어가 누구인가"라는 질문이 v1과 v2의 차이를 설명한다. v1의 주어는 "네이버"였다 — 네이버가 이 기능을 만들어야 한다는 제안서였고, 외부에서 가설을 검증할 방법이 없었다. v2의 주어는 "박민준과 DARTshot 팀"이다. 사용자가 직접 접속하고, 팀이 직접 KPI를 측정한다. PRD가 "팀 사이의 해석 차이를 줄이는 기준점"이 되려면 실행의 주체가 PRD를 쓰는 사람 안에 있어야 한다는 걸 v1 → v2 전환에서 배웠다.