DEVLOG 가 1,900줄이 넘어 최근에 무엇을 왜 바꿨는지 찾기 어려웠다. - DEVLOG.md: 개발 이력상 남길 가치가 있는 항목만 요약 - RENDERING.md: 정적 사이트 · 미리보기 · 발행 세 경우의 흐름과 담당 파일 - README · AGENTS · PRODUCT: 삭제한 DEVELOPMENT_DIRECTION.md 링크 정리(삭제 자체는 앞 커밋), admin 은 필요한 규모가 되면 개발한다는 안내, 템플릿 문서 링크 문서만 바꿈 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.9 KiB
PRODUCT — 무엇을, 누구를 위해, 무엇을 안 하는가
이 문서는 제품 판단의 단일 출처다. 코드에서 읽을 수 없는 것만 적는다 — 누구를 위한 것인지, 무엇을 성공으로 볼 것인지, 그리고 하지 않기로 한 것이 무엇인지. 구현이 궁금하면 ARCHITECTURE.md, 미결 사항은 DECISIONS.md.
1. 한 문장
상호명 하나를 입력하면, AI 검색이 그 가게를 공식 홈페이지 기준으로 설명하게 만드는 정적 홈페이지를 만들어 발행한다.
"예쁜 사이트를 싸게"가 아니다. 예쁜 사이트는 이미 흔하다. 우리가 파는 건 검색·AI 답변에서의 1차 출처 지위다. 이 문장이 제품의 모든 트레이드오프를 정한다 — 아래 3절이 그 결과다.
2. 문제
소상공인은 이미 네이버 플레이스·인스타그램에 정보를 올려 두고 있다. 그런데:
- 그 정보는 AI 검색엔진이 읽지 못한다. 네이버·카카오 생태계는 AI 크롤러를 통째로 차단한다 (실측 근거: DATA_SOURCE_RESEARCH.md 1절).
- 그래서 ChatGPT·Perplexity·Gemini 가 그 가게를 설명할 때 근거로 삼을 1차 출처가 없다. 블로그 후기나 오래된 기사에서 추측한다.
- 사장님이 직접 홈페이지를 만들어도, CSR 로 만들면 크롤러는
<div id="root"></div>만 읽고 떠난다.
빈 판이다. 경쟁자가 스스로 문을 잠갔기 때문에, 크롤러가 읽을 수 있는 정적 HTML 하나만 정확히 놓아도 그 가게의 정답이 된다.
3. 그래서 정한 제품 원칙
이건 취향이 아니라 1절에서 기계적으로 따라 나온 결론이다. 어길 거면 1절부터 다시 논의한다.
| 원칙 | 왜 | 어디에 박혀 있나 |
|---|---|---|
| 발행물은 정적 HTML — 서버도 JS 실행도 없이 읽힌다 | 크롤러가 읽어야 존재하는 것이다 | solution/site 프리렌더 |
| 확인된 값만 발행한다 | 틀린 정보를 1차 출처로 만들면 제품이 해를 끼친다 | publish_gate.py 규칙 1 |
| 고유 콘텐츠 0건이면 발행 거부 | 같은 템플릿 대량 생성은 검색엔진의 스팸 판정 대상 | publish_gate.py 규칙 2 |
| JSON-LD 값 = 화면 값 | 어긋나면 구조화 데이터 조작이다. 색인에서 통째로 불신당한다 | publish_gate.py 규칙 3, 빌드 실패 |
| 백엔드는 HTML 을 만들지 않는다 | 렌더링과 데이터를 한 몸으로 묶으면 둘 다 못 고친다 | payload JSON 경계 |
| 뚫어야 볼 수 있는 데이터는 안 쓴다 | 봇 탐지 우회는 결론과 무관하게 영구 금지 | DECISIONS.md 1-1 |
4. 사용자 — 셋이고, 요구가 서로 반대다
| 사장님 | 우리 회사 운영자 | 손님 · AI 크롤러 | |
|---|---|---|---|
| 무엇을 한다 | 내 가게 정보 확인·수정, 사진 고르기, 발행 | 전체 사이트 품질·발행 상태 관리, 수집 소스 운영 | 읽는다 |
| 원하는 것 | 몇 번 눌러서 끝나기 | 무엇이 왜 막혔는지 보이기 | 정확한 사실, 즉시 |
| 로그인 | 최소 (막히면 만들어 보지도 못한다) | 엄격 | 없음 |
| 화면 성격 | 위저드 + 에디터 | 대시보드 + 목록 | 정적 문서 |
| 현재 코드 | solution/frontend /builder |
admin/frontend /places, /local-content |
solution/site |
★ 앞의 둘은 2026-08-31 에 두 앱으로 갈랐다 — 한 앱이면 내부 화면 코드가 사장님 번들에 그대로 실려 나가기 때문이다. 근거와 경계는 ARCHITECTURE.md 4절.
권한 코드는 common/enums.py UserRole: 1 USER(사장님) / 2 OWNER(고객사 최상위) /
3 DEVELOPER(내부 운영 — 고객사에 존재를 노출하지 않는다).
5. 지금 하는 것 (범위)
- 업종: 숙박 · 카페 · 음식점 · 관광체험 (
PlaceCategory). 업종 추가 = 코드 1줄 + 스키마 파일 1개 - 수집 → 사장님 확인 → LLM 생성 → 편집 → 발행 게이트 → 정적 발행 → IndexNow 통보
- 사이트 하나 = 한 장(2026-08-31 결정). 쪼개면 페이지가 얇아지고 검색엔진이 색인에서 버린다 — 자세한 근거는 ARCHITECTURE.md 5절
- 발행 후 색인 통보: 네이버 · Bing · Yandex (IndexNow). 구글은 IndexNow 미지원 → 사이트맵 제출
6. 하지 않는 것 (Non-goals)
여기 적힌 걸 하자는 제안이 오면, 하기 전에 이 줄을 지우는 합의부터 한다.
| 안 한다 | 왜 |
|---|---|
| 네이버 플레이스를 복제한 사이트 | AI 크롤러가 못 읽는 걸 옮겨 봐야 목표(1절)에 기여가 0이다. 게다가 robots.txt 위반 |
| 봇 탐지 우회 크롤링 (헤드리스 브라우저, IP 회전, 핑거프린트 위조) | 영구 금지. 야놀자 v 여기어때 = 민사 10억 배상 + 복제 금지 선례 |
| 범용 홈페이지 빌더 / 자유 편집 | 자유도를 주면 게이트(3절)를 우회할 수 있다. 게이트가 제품이다 |
| 이미지 호스팅 | 지금은 네이버 CDN 핫링크. ⚠️ 중기 리스크는 DEPLOY.md 1절 참고 |
| 예약·결제 처리 | 사이트는 예약 채널로 보낸다. 거래를 품지 않는다 |
| CSR 발행 사이트 | 크롤러가 못 읽으면 만든 의미가 없다 |
7. 성공 기준
제품이 동작한다고 말할 수 있는 조건 (코드가 이미 강제하는 것):
- 발행된 사이트가 게이트 3규칙을 통과한다 — 미검증 fact 0, 고유 콘텐츠 ≥ 1, JSON-LD 불일치 0
/s/<slug>가 끝 슬래시 없이도 200 (사장님이 주소창에 치는 형태)- 크롤러가 JS 없이 본문·JSON-LD·
llms.txt를 전부 읽는다 - 사이트맵과 IndexNow 통보가 실제로 존재하는 주소를 가리킨다
(조용히 틀리는 종류라 자동 검증이 유일한 방어 —
scripts/check_search_ready.py)
사업 기준 — 아직 정하지 않았다. 정하면 여기에 날짜와 함께 적는다. 후보: 발행 후 N일 내 AI 답변 인용률 / 구글 색인 등재율 / 사장님 발행 완주율.
8. 제약
비용은 사이트당 변동비·계정/계약당 고정비·일회성 개발비로 구분한다. SNS의 Gemini 생성·알림톡 건당 발송은 변동비다. Threads 직접 API에 공개 과금은 확인되지 않았다. 고정비를 사이트 생성 미터에 배분해 배치 크기에 따라 게이트 판정이 달라지게 하지 않는다. API_USAGE 5절 참조.
- 제품 원가 상한: 사이트 1건당 $1 (약 1,400원). Perplexity·Kakao·Gemini 호출 합계. 이 상한이 "LLM 을 몇 번 부를 수 있나"를 정한다. 현황: API_USAGE.md (★ 개발비와 섞지 말 것 — 그건 일회성이다)
- 법적 제약은 DECISIONS.md 1절이 단일 출처다. 수집 어댑터를 추가하기 전에 읽는다.
- 발행 호스트는 백엔드·프론트 두 곳에 있고 값이 같아야 한다. 그리고 payload JSON 에 구워져 들어간다 — 바꾸면 재발행이 필요하다. (AGENTS.md 함정 목록)
9. 아직 안 정한 것
정해지는 대로 이 절에서 위로 올린다. 코드로 미리 풀지 않는다. ★ 보류 중인 결정은 DECISIONS.md 1절이 단일 출처다 — 여기 복사하지 않는다. 아래는 그중 제품 정의에 해당하는 것만 남긴다.
- 사업 성공 지표 (7절)
- 관리자가 사장님 콘텐츠를 어디까지 고칠 수 있나 (DECISIONS.md 1-3)
- 과금 모델 — 건당 / 구독 / 무료+상위요금제
- 사장님 해지 시 발행된 사이트의 운명 (DECISIONS.md 1-4)
- 고객사(에이전시) 다중 입점 여부 —
companies테이블은 이미 있으나 제품 결정은 미정