서비스 기획과 상품 설계
작성일: 2026년 10월 15일. 아래 브랜드·가격·기간·성능 목표는 모두 검증 전 제안입니다.
어떤 서비스를 만들 것인가
임시 이름은 연, 스케치. 취향 설문을 받은 뒤, 가상의 성인 인물 초상과 관계 취향 리포트를 제공하는 한국어 웹 서비스입니다. 초기 고객은 이 콘텐츠를 재미로 구입하는 한국어 성인으로 가정합니다. 실제 인연을 알아맞히거나 현실의 특정 인물을 찾아준다고 판매하지 않습니다.
사용자가 제공한 Nebula 링크와 같은 '인연 스케치' 주제에서 출발했지만, 원본 화면의 내용이 표시되지 않아 구조와 상품 조건은 독자적으로 제안했습니다. 로고·이미지·후기·문구·코드를 가져오지 않았습니다.
사실과 제안의 구분
| 항목 | 확인 상태 | 이번 작업의 처리 |
|---|---|---|
| /ko/soulmate-sketch/trialPayment | 제목은 표시됐으나 본문은 빈 화면 | 원본 가격·자동결제 조건 미확인 |
| /ko/soulmate-sketch/prelanding | 빈 제목·버튼 영역, 개인정보·약관 링크 관찰 | 원본 비주얼·카피·버튼 문구 미확인 |
| 원본 AI/사람 화가 사용 여부 | 확인 불가 | 우리 서비스는 AI 창작으로 명시하는 제안 |
| 원본 설문과 질문 수 | 확인 불가 | 우리 설문 10개를 새로 작성 |
| 원본의 매출·전환율 | 확인 불가 | 추정 실적이나 성공 지표를 넣지 않음 |
| 우리 가격 900원 | 2026-10-16 사용자 결정 | 1회 구매, 실결제는 연결·승인 전 |
| 구독/체험 결제 | 원본 확인 불가 | 첫 버전은 자동 갱신 없는 단건 제안 |
첫 버전 상품
| 내용 | 제안 |
|---|---|
| 상품 | 인연 스케치 1장 + 관계 취향 리포트 + 이미지 저장 |
| 가격 | 소비자 표시가 900원, 1회 구매(2026-10-16 사용자 결정). 세금 표시와 정산 처리는 사업자 상황 확인 후 확정 |
| 구매 방식 | 1회 결제. 가입을 먼저 요구하지 않는 주문 흐름 |
| 결제 전 제공 | 상품 설명, 샘플 그림, 샘플 리포트, 전체 가격, 공급 예상 시간, 취소·환불 안내 |
| 결제 후 제공 | 주문에 귀속된 새 이미지와 구조화된 리포트, 결과 재접속 수단 |
| 생성 목표 | 운영 목표로 3분 이내. 공급사 실측 전 고객에게 확정 보장하지 않음 |
| 오류 대응 | 대기 상태 안내 → 제한된 자동 재시도 → 재생성 또는 환불 접수 |
| 초기 제외 | 채팅 상담, 궁합 계산, 구독, 사진 업로드, 실제 인물 찾기, 앱 출시 |
단건 상품의 재구매 이유가 확인되기 전에는 구독을 추가하지 않습니다. 나중에 구독을 검토한다면 월별 실제 제공 콘텐츠, 결제일, 갱신금액, 해지 효과, 사용하지 않은 부분의 처리부터 정의합니다.
사용자 흐름
- 시작 화면: 제공물과 AI 창작 성격을 이해하고 시작합니다.
- 설문: 대사와 만남의 장면을 고르며 인물·분위기·플러팅·관계 취향을 표현합니다.
- 이야기 구성: 선택한 답을 정리하는 6단계 연출 뒤 이메일 입력으로 이어집니다. 마지막 결제 페이지에서 스케치 예시와 가격을 확인합니다.
- 주문: 서버에서 고정 SKU 가격으로 주문을 만들고, 결제 조건과 필요한 안내를 보여줍니다.
- 결제: PG에서 인증한 뒤 서버가 가격·주문·사용자를 검증하고 승인합니다.
- 제작: 승인된 주문만 큐에 넣고 새 초상/리포트를 만듭니다.
- 결과: 이미지·텍스트를 확인하고 저장합니다. 링크 재발급과 문의 경로를 제공합니다.
현재 시제품은 이야기 구성 뒤 이메일 입력→최종 결제 페이지로 연결됩니다. PG가 미연결된 결제 버튼은 준비 상태를 안내하며, 제작자용 샘플 보기에서 결과를 검토할 수 있습니다. 이메일 전송·저장과 결제·주문별 AI 생성은 하지 않습니다.
설문 원고
| 번호(내부) | 질문 | 선택 방식 |
|---|---|---|
| 1 | 그 사람이 딱 한마디만 한다면, 뭐가 더 위험해요? | 단일 선택·자동 이동 |
| 2 | 딱 한 번, 영화처럼 마주친다면? | 단일 선택·자동 이동 |
| 3 | 그 사람이 먼저 말을 걸었어요. 당신은 어떻게 할래요? | 단일 선택·자동 이동 |
| 4 | 잠깐, 지금 머릿속에 떠오른 그 사람은 어떤 모습이에요? | 단일 선택·자동 이동 |
| 5 | 그 얼굴을 조금 더 선명하게 떠올려볼까요? | 단일 선택·자동 이동 |
| 6 | 같이 걷는 중이에요. 어느 순간에 마음이 흔들릴까요? | 단일 선택·자동 이동 |
| 7 | 좋아하는 티, 어디까지 내면 더 설레요? | 단일 선택·자동 이동 |
| 8 | 솔직히, 이런 건 좀 반칙이죠. | 최대 2개·다음 버튼 |
| 9 | 설레는 건 알겠어요. 그런데, 오래 마음이 가는 말은? | 단일 선택·자동 이동 |
| 10 | 헤어진 뒤, 휴대폰이 울렸어요. 어떤 메시지였으면 좋겠어요? | 단일 선택·자동 이동 |
화면에는 총 문항 수와 진행률을 표시하지 않고 현재 장면의 제목만 표시합니다. 서점·카페·여행 선택에 따라 세 번째 질문의 대사와 선택지가 바뀝니다.
이름·생년월일·출생 시각·정확한 위치는 이 상품에 필요하지 않아 첫 버전에서 제외했습니다. 사주/점성술을 상품에 추가한다면 계산 엔진과 시간대·달력 변환을 별도로 검증해야 합니다. LLM이 천문·역법 계산을 임의로 지어내도록 만들지 않습니다.
결제와 생성 순서
초기 운영안은 결제 전 고정 샘플을 공개하고 결제 후 개별 이미지를 만드는 방식입니다. 미결제 사용자에게 매번 유료 이미지 API를 실행하지 않으므로 비용을 통제하기 쉽습니다. 새 그림이 이미 완성돼 잠겨 있다고 말하지 않습니다.
결제 전 개인화 초상 자체를 보여줘야 한다면 별도 실험으로 다룹니다. 기기/세션 요청 제한, 짧은 보유 기간, 저비용 썸네일, 봇/남용 제한을 추가하고 미결제 생성비를 CAC에 포함합니다. 클라이언트 CSS blur는 유료 원본 보호 기능이 아니므로 원본은 비공개 저장소에서만 제공합니다.
가격·수익 실험표
2026-10-16 사용자 결정: 판매가는 900원, 1회 구매이며 자동 갱신은 없다. 이전 9,900원 가설은 이 결정으로 대체한다. 실결제는 기존 비욘드 토스 계약의 적용 범위와 일반결제 이용 가능 여부를 확인한 뒤 연결한다.
단위 경제성 계산식:
주문당 기여액 = 실수취매출 - PG 수수료 - 이미지비 - 텍스트비 - 재시도비 - 메일/저장비 - 평균 환불·CS 비용 - 광고획득비
실수취매출 계산에 적용되는 세금·환불은 사업자와 거래 구조를 확인해 반영합니다. 아래는 이전 9,900원 가설에서 사용한 비용 가정을 새 가격에 대입한 민감도 예시로, 실제 공급사 견적이나 이익 예측이 아닙니다. 비용 가정이 유지되면 적자이므로, 유료 출시 전에 실제 원가를 확인해야 합니다.
| 가정 항목 | 단순 예시 |
|---|---|
| 계산에 넣는 주문 매출 | 900원 |
| PG 비용 가정 | 350원 |
| 생성·재시도·저장·메일 비용 가정 | 1,000원 |
| 환불·고객지원 평균 비용 가정 | 500원 |
| 광고 전 잔여액 | -950원 |
| 예시 광고획득비 | 3,000원 |
| 고정비·세금 반영 전 잔여액 | -3,950원 |
실제 가격 결정에는 PG 계약 요율, 공급사 출력 단가, 실패/재시도율, 무료 방문자의 비용, 실제 환불률을 사용합니다. 이 표를 실제 원가나 예상 손익으로 제시하지 않습니다.
구현 명세와 운영 아키텍처
현재 구현과 다음 구현
| 구성 | 현재 | 운영 버전에 필요한 일 |
|---|---|---|
| 화면 | HTML/CSS/JS, 장면형 설문→구성 연출→이메일→결제 페이지 | 실 API 연결, 모바일 브라우저 QA |
| AI | 샘플 초상 2장 + 취향별 로컬 문구 | 서버 텍스트 생성, 이미지 생성, 유효성 검사, 비용 기록 |
| 결제 | 최종 주문 화면, PG 준비 상태 안내 | Toss PG 계약/심사, 테스트키 연결, 서버 승인·환불 |
| DB | SQL 초안 | 실제 DB, 마이그레이션, 저장소 어댑터 |
| 작업 큐 | 미연결 | 결제 outbox, 큐 소비자, 재시도, 작업 lease |
| 저장 | 화면 메모리 | 비공개 이미지 저장소, 결과 권한, 만료 링크 |
| 고객 접근 | 없음 | 익명 세션 + 이메일 재접속 또는 인증 계정 |
| 메일 | 미연결 | 발신 도메인 인증, 결과/실패 메일, 반송 관리 |
| 관리자 | 미구현 | 주문 검색, 재생성, 환불 접수/처리, 감사 기록 |
| 관측 | 미연결 | 오류 알림, 결제 대사, 생성 대기/실패 감시 |
권장 구성안
현재 배포는 정적 시제품입니다. 같은 Sites 환경에서 운영까지 확장한다면 Worker 서버, D1 주문 DB, 비공개 R2 결과 저장, 작업 큐/스케줄 소비자, 주문 단위 동시 실행 제어가 후보입니다. 이들 자원은 이번 작업에서 생성하지 않았습니다.
다른 호스팅을 사용한다면 기존 정적 프런트를 유지하고 서버 API와 PostgreSQL, 비공개 객체 저장소, 큐를 붙여도 됩니다. 프레임워크를 바꾸는 일이 상품 검증의 선행 조건은 아닙니다.
서버 내부 흐름: 주문 생성 → PG 승인 → 주문 PAID + outbox 원자 기록 → 큐 소비 → 텍스트/이미지 생성 → 결과 원자 연결 → 완료 안내.
외부 API 호출을 DB 트랜잭션 안에서 오래 대기시키는 단순 구현은 피합니다. PG 호출과 DB 갱신은 원자적이지 않으므로 승인 결과 조회에 기반한 복구 프로세스를 반드시 둡니다. 참조 모듈의 withOrderLock은 보관/직렬화 계약을 설명하며, 실제 DB 구현은 아닙니다.
HTTP API 계약 초안
모든 비공개 API는 서버가 검증한 세션 소유권을 사용합니다. JSON 본문의 sessionId를 신뢰해서는 안 됩니다.
| 메서드·경로 | 입력 | 응답·동작 |
|---|---|---|
| POST /api/session | CSRF/Origin 검증 | 256비트 임의 세션 토큰을 HttpOnly·Secure·SameSite 쿠키로 발급, DB에는 hash만 저장 |
| POST /api/quizzes | 스키마 버전, 선택지 ID 10개(복수 선택 배열 포함) | 서버 allowlist 검증 → quizId |
| POST /api/orders | quizId, sku | 소유권·필수 안내 버전 확인 → 서버 가격의 orderId/amount/currency |
| POST /api/payments/confirm | orderId,paymentKey,amount | 서버 주문 가격 일치·소유권·PG 응답 검사 → PAID 또는 복구 대기 |
| POST /api/webhooks/toss | 공급사 이벤트 | 이벤트 형식·중복 검사, 공식 제공 검증 방법 적용, 서버 PG 조회로 결제 상태 재검증 후 처리 |
| GET /api/orders/:id | 쿠키 | 소유 주문 상태와 결과 준비 여부. 타인 주문은 404 |
| GET /api/results/:id | 쿠키/검증된 일회성 접근 | 소유권·환불/철회 상태 검증 → 리포트, 짧은 만료의 이미지 접근 |
| POST /api/access-links | 이메일, 주문 확인 수단 | 주문 존재 여부와 무관한 동일 응답, 제한된 메일 발송, 일회용 토큰 hash 저장 |
| POST /api/support/refunds | orderId, reason | 소유권 확인 후 중복 방지된 환불 접수 |
| POST /api/admin/orders/:id/retry | 관리자 역할·재인증 | 실패 작업만 제한된 재처리, 감사 로그 |
이메일 재접속 수단은 프로덕션에만 도입합니다. 현재 시제품은 이메일 입력값을 페이지 메모리에서만 보관하며 서버로 전송·저장하지 않습니다. 토큰·이메일·설문 답은 분석 이벤트나 에러 로그에 넣지 않습니다. 결과 token을 분석 SDK가 읽는 URL에 오래 남기지 않으며, 교환 뒤 URL에서 제거하고 Referrer-Policy를 적용합니다.
결제 구현 규칙
- 서버의 SKU 카탈로그에서 금액을 결정합니다. 브라우저가 보낸 금액을 주문 가격으로 사용하지 않습니다.
- PG 성공 리다이렉트만으로 PAID를 주지 않습니다. 서버 승인 응답의 주문·금액·통화·상태·paymentKey를 검증합니다.
- 사용자 소유권 확인 → 주문별 동시 실행 제어 → 기존 결제 상태 검사 → 승인/조회 → 결과 반영 순서입니다.
- 불확실한 타임아웃은 결제 실패라고 단정하지 않습니다. PG 승인 여부를 조회해 대사할 때까지 결과 생성과 추가 결제를 보류합니다.
- 중복/역순 콜백과 웹훅은 정상적으로 발생할 수 있다고 가정합니다. 주문별 paymentKey UNIQUE와 outbox/orderId UNIQUE를 사용합니다.
- 웹훅에 모든 PG가 공유하는 서명 규칙이 있다고 가정하지 않습니다. 실제 사용하는 Toss 제품/이벤트의 공식 검증 요건을 확인합니다. 위조 이벤트 본문만으로 권한을 주지 않습니다.
- 결제 승인 후 큐 발송에 실패해도 outbox가 남아 재처리할 수 있어야 합니다.
- 취소·부분 취소·환불 대기·환불 완료를 대사합니다. 환불 완료 뒤 재생성/유료 원본 신규 접근은 정책에 따라 차단합니다.
- 결제 API의 시크릿 키는 서버 전용입니다. Git·정적 JS·로그에 노출하지 않습니다.
Toss 공식 가이드는 요청 전 주문번호/금액 저장과 승인 전 검증, 서버 승인을 설명합니다. API의 결제 인증 유효 시간도 연동 시 확인합니다. 결제 흐름, 주문서형 연동, Core API.
데이터 설계
backend/schema.sql은 sessions, quizzes, orders, consent_records, outbox, generation_jobs, results, payment_events의 초안을 포함합니다. 모든 테이블은 서버에서만 접근합니다. SQL에 외부 사용자가 직접 접근하는 권한을 주지 않습니다.
작업 claim은 QUEUED → RUNNING 조건부 갱신, lease 만료, 최대 시도 횟수를 사용합니다. 주문별 결과 UNIQUE를 지켜 중복 작업에서도 하나의 최종 결과만 연결합니다. 타임아웃 뒤 오래된 작업이 돌아와 새 결과를 덮어쓰지 않도록 job attempt/버전을 비교합니다.
퀴즈 답변 만료와 법정 거래기록 보존 기간은 별도입니다. 사용자가 개인정보 삭제를 요청해도 거래기록을 무조건 같이 지우는 cascade는 사용하지 않습니다. 익명화·분리 보관·권한 제한을 구분해 설계합니다.
보안과 남용 방지
- 쿠키 세션, Origin/CSRF 검증, 서버 선택지 allowlist, 본문 크기 제한.
- 결제·생성·결과·환불 엔드포인트별 소유권 검증. 추측하기 어려운 ID만으로 권한 검사를 대체하지 않음.
- 세션/기기/네트워크별 속도 제한. 결제 전 유료 이미지 생성 제한.
- 이미지·리포트 비공개 저장, 인증된 서버를 통한 단기 URL 또는 스트리밍.
- HTML은 시스템 템플릿으로 렌더링하고 모델의 HTML/스크립트를 실행하지 않음.
- 선택지를 서버 프롬프트에 매핑하며, 임의 자유 입력/사진 업로드는 초기 버전에서 제외.
- 운영자 재생성·환불·삭제 작업에 역할 검사와 감사 기록.
- 오류 서비스에는 마스킹한 에러 코드·내부 작업 ID만 전송. 접근 토큰/카드정보/설문 답/이메일을 전송하지 않음.
생성 상태와 복구
| 상태 | 사용자에게 보여줄 내용 | 서버 처리 |
|---|---|---|
| CREATED | 결제 진행 전 | 만료 주문 정리 |
| PAID / QUEUED | 결제 확인, 제작 대기 | outbox 재전송 가능 |
| RUNNING | 제작 중 | heartbeat/lease, 비용 계수 |
| SUCCEEDED | 결과 확인 | 비공개 결과 연결 |
| FAILED | 제작이 지연돼 재처리/환불 문의 가능 | 원인 코드 보관, 제한된 재시도 |
| PAYMENT_RECONCILIATION_REQUIRED | 결제 확인 중 | PG 조회와 DB 대사, 추가 결제 유도 금지 |
| REFUND_PENDING / REFUNDED | 환불 처리 상태 | 중복 환불 방지, PG 결과 확인 |
실제 생성 단계가 없는 동안 퍼센트나 '완성된 그림'을 꾸며 표시하지 않습니다. 시제품의 짧은 로딩도 샘플 준비임을 표시했습니다.
검증 기준
필수 실서비스 테스트: 금액 변조, 타인 주문 조회, 중복/동시 승인, PG 타임아웃 후 승인 복구, 승인 후 DB 실패, outbox 중복 발송, 취소 이벤트의 역순 도착, 생성 타임아웃, 환불 중 중복 클릭, 결과 URL 만료, 세션 만료 후 재접속, 이미지/리포트 버전 일치, 데이터 삭제와 거래기록 보존 분리.
이번 Node 테스트는 참조 모듈에 대한 단위 테스트입니다. PG 실호출, DB 트랜잭션, 웹훅, 실물 결제/환불 테스트를 대체하지 않습니다.
AI 생성 프롬프트와 품질 기준
이 문서는 연결 시 사용할 명세입니다. 현재 시제품은 아래 프롬프트를 요청마다 실행하지 않습니다. 모델·가격·키는 미선정이며 공급사 비교 후 확정합니다.
입력 스키마
{
"schema_version": 2,
"spark": "noticed | remembered | stay",
"scene_reply": "join | wait | flirt",
"tension": "direct | slow | playful",
"details": ["voice | eyes | smile | scent | hands"],
"ending": "linger | promise | honest",
"reflections": {"fate":"yes | no", "first_spark":"yes | no", "coincidence":"yes | no", "someone":"yes | no"},
"subject": "male | female | any",
"age": "twenties | thirties | forties",
"mood": "warm | calm | bright",
"value": "talk | trust | growth",
"place": "cafe | book | travel",
"language": "ko"
}
reflections는 선택적으로 답한 팝업 값이며, 건너뛴 키는 생략합니다. 실제 사람의 정체나 미래 인연을 추정하는 데 사용하지 않습니다. details는 중복 없는 1~2개 선택 배열입니다. 서버가 열거형·배열 길이·중복 여부를 검사합니다. 사용자 자유 입력, 이름, 생년월일, 이메일은 모델에 보내지 않습니다. 예시: male, thirties, calm, trust, book.
리포트 시스템 프롬프트 v1
너는 한국어 창작 리포트 작가다. 구조화된 취향 선택지를 바탕으로 가상의 성인 인물과 관계의 장면을 쓴다.
이 콘텐츠는 오락과 자기 탐색을 위한 창작물이며 실제 사람, 운명, 미래의 사건을 알아내는 분석이 아니다.
아래 원칙을 지켜라.
1. 입력에 없는 개인정보·성격 진단·과거 사건을 추론하거나 지어내지 마라.
2. '당신의 미래 배우자는', '반드시 만난다', '운명적으로', '정확도 98%' 같은 확정적 예언·효능 주장을 쓰지 마라.
3. 유저가 고른 가치와 분위기를 명시적으로 반영하되 그 선택에서 말할 수 있는 범위만 써라.
4. 외모에서 성격·소득·국적·신뢰도를 판정하지 마라.
5. 상상 장면은 '상상해보세요' 등 창작임이 드러나는 문장으로 써라. 구체적 만남 날짜를 예고하지 마라.
6. 성인만 등장시키고, 실존 인물·유명인과의 동일성이나 유사성을 요구하지 마라.
7. 자연스럽고 간단한 한국어를 써라. 과장, 공허한 칭찬, 불안 유도, 결제 권유는 넣지 마라.
8. JSON만 출력하라. HTML, Markdown 코드블록, 링크, 이미지 URL은 출력하지 마라.
리포트 사용자 프롬프트 v1
검증된 취향 입력: {{SERVER_VALIDATED_CHOICES_JSON}}
다음 JSON 스키마에 맞춰 한국어 리포트를 작성하라.
- title: 20~35자 안팎의 창작 제목
- character: 가상 인물의 분위기를 묘사한 120~180자
- relationship: 선택한 관계 가치를 반영한 120~180자
- scene: 선택한 장소의 상상 장면 120~180자
- reflection: 부담 없는 자기 탐색 질문 1개
- disclosure: '취향을 바탕으로 만든 가상의 창작 콘텐츠이며 실제 인물이나 미래를 예측하지 않습니다.'
제시한 글자 수는 품질 목표다. 스키마 준수와 의미의 정확성을 우선한다.
결과 스키마
{
"type": "object",
"additionalProperties": false,
"required": ["title", "character", "relationship", "scene", "reflection", "disclosure"],
"properties": {
"title": {"type":"string", "minLength":5, "maxLength":60},
"character": {"type":"string", "minLength":40, "maxLength":400},
"relationship": {"type":"string", "minLength":40, "maxLength":400},
"scene": {"type":"string", "minLength":40, "maxLength":400},
"reflection": {"type":"string", "minLength":5, "maxLength":150},
"disclosure": {"type":"string", "const":"취향을 바탕으로 만든 가상의 창작 콘텐츠이며 실제 인물이나 미래를 예측하지 않습니다."}
}
}
공급사가 구조화 출력 기능을 제공하면 해당 스키마를 API 옵션에 매핑합니다. 그래도 서버에서 다시 검증합니다. 깨진 JSON, 필드 누락, 실제 인물 동일성 주장, 확정적 예언은 재시도 또는 실패 상태로 처리합니다. 모델이 작성한 disclosure 대신 서버 고정 문구를 최종 화면에 사용해도 됩니다.
초상 이미지 프롬프트 v1
Create one original graphite pencil portrait of a wholly fictional adult person.
Subject presentation: {{SERVER_SUBJECT_DESCRIPTION}}
Adult age range: {{SERVER_ADULT_AGE_RANGE}}
Expression and drawing mood: {{SERVER_EXPRESSION_DESCRIPTION}}
Composition: shoulders-up, natural proportions, relaxed gaze, simple clothing,
head fully inside the frame, portrait orientation, centered with generous margins.
Medium: fine graphite hatching, delicate hand-drawn pencil lines, warm ivory paper,
subtle paper grain, controlled shading, monochrome graphite only.
The person is fictional, not a real soulmate, not an identified or predicted person.
No celebrity resemblance request, no real-person reference photo, no religious or
ethnicity-based assumptions, no text, signature, logo or watermark.
No split panels, no duplicate faces, no extra limbs, no collage, no photographic UI.
서버 매핑
| 필드 | 매핑 예시 |
|---|---|
| male | adult man |
| female | adult woman |
| any | 서버가 기록한 중립적 가상 인물 설계; 유저의 성별/성적 지향으로 해석하지 않음 |
| twenties | adult, around 27–29 |
| thirties | adult, around 30–39 |
| forties | adult, around 40–55; 상품 설명의 범위도 이에 맞게 확정 |
| warm | relaxed gentle expression, soft graphite shading |
| calm | composed natural expression, restrained pencil lines |
| bright | relaxed small smile, lively but realistic line treatment |
관계 가치와 장소는 초상에서 신체 특성으로 변환하지 않습니다. 인물의 국적/민족을 설문 답에서 추론하지 않습니다. 특정 초상 스타일을 제공하려면 제품의 명시적 선택 항목으로 분리합니다.
품질 평가 표
다음은 출시 전 확인할 평가 항목과 목표이며 측정 결과가 아닙니다.
| 항목 | 합격 기준 |
|---|---|
| 인물 | 성인으로 보이며 실제 인물 동일성 주장 없음 |
| 해부·구도 | 얼굴 중복·눈 비대칭 오류·잘림·추가 신체 등 명백한 오류 없음 |
| 취향 반영 | 선택한 성인 나이 범위·표정·그림 스타일이 설정과 부합 |
| 텍스트 | JSON 스키마 유효, 3개 본문이 서로 같은 말만 반복하지 않음 |
| 표현 | 확정적 미래/건강/성격 진단 없음, 상상 장면임이 분명 |
| 파일 | 실제 MIME/용량/디코딩 확인, 최소 해상도는 공급사 검증 후 설정 |
| 지연·비용 | 요청부터 결과까지 시간, 출력 건당 비용·재시도 비용 기록 |
| 일치 | 주문 ID, 입력 버전, 프롬프트 버전, 이미지·리포트 버전이 맞음 |
텍스트/이미지 공급사 각각 2곳을 후보로 두고 동일한 20개 이상의 대표 입력으로 비교합니다. 선정 기준은 한국어 품질, 선화 품질, 지연, 재시도율, 출력 단가, 상업 이용 조건, 데이터 보유/학습/국외이전 조건입니다. 테스트 요청도 요금이 발생할 수 있으므로 공급사 계정·예산 확정 후 실행합니다. 이번 작업에서는 유료 API 테스트를 실행하지 않았습니다.
재시도·예산 정책 초안
- 작업 하나에 최대 자동 재시도 2회라는 가설을 두고 테스트로 조정합니다.
- 요청·출력량 상한과 일별 총비용 상한을 서버에 둡니다. 실제 금액은 공급사 선정 뒤 정합니다.
- 실패를 성공한 그림으로 위장하지 않습니다. 샘플을 대신 제공하려면 고객에게 알리고 선택권을 줍니다.
- 한 주문에 성공 결과가 이미 있으면 재시도 메시지로 새 유료 요청을 만들지 않습니다.
- 결제 전 유료 생성은 기본 비활성화합니다.
결제·개인정보·환불 운영 준비
아래는 제품 구현을 위한 운영 초안입니다. 빈 정보를 채워 자동으로 법적 요건이 충족되는 완성 약관은 아닙니다. 실제 판매자·공급사·판매국가·데이터 흐름에 맞춰 출시 전 확정해야 합니다.
사업자와 판매 준비
| 필요한 정보/작업 | 준비할 내용 | 현재 상태 |
|---|---|---|
| 판매자 | 상호, 대표자, 사업자등록번호, 주소, 연락처 | 미확정. 실제 값을 임의로 넣지 않음 |
| 통신판매 | 신고 대상/면제 해당 여부 확인, 필요한 신고 | 미확인 |
| PG 심사 | AI 생성 디지털콘텐츠/인연 스케치 상품 설명, 가격·공급·환불 페이지 제출 | 미신청 |
| 도메인 | 원하는 이름/사용권 확인, DNS 연결 | 미구매 |
| 문의 | 지원 이메일, 접수 양식, 답변 담당자·운영시간 | 미확정 |
| 정산 | PG 정산 계좌, 계약 요율, 정산 주기 | 미확정 |
| 공급사 | 텍스트·이미지·메일·호스팅 계약과 이용 조건 | 미확정 |
PG에는 '실제 배우자/미래를 보장'하는 상품이라고 소개하지 않고 실제 제공하는 AI 창작 이미지와 리포트를 설명합니다. 해당 업종의 결제 가능 여부·심사 조건은 PG에 확인해야 하며, 승인을 받았다고 가정하지 않습니다.
결제 화면 원고 초안
- 상품: 인연 스케치 이미지 1장 + 관계 취향 리포트.
- 총 결제금액: 900원. 가격은 기획안이며 운영 확정 시 세금·추가비용 포함 최종 표시를 검토합니다.
- 결제 횟수: 1회 결제. 구독/자동 갱신 없음.
- 제공 방식: 결제 승인 후 제작, 결과 페이지에서 확인 및 다운로드. 이메일은 고객이 선택한 결과 재접속 수단으로만 사용.
- 공급 시점: 실측한 완료 범위와 최대 지연 대응을 확정한 뒤 표시. 현재 '즉시'나 '3분 보장'을 약속하지 않음.
- 상품 성격: 취향을 바탕으로 만든 가상의 AI 창작 콘텐츠. 실제 인물이나 미래를 예측하지 않음.
- 결제 버튼: 900원 결제하고 제작 시작. 실금액과 유료임이 분명한 문구 사용.
필요한 동의와 고지 항목은 법적 근거별로 분리합니다. 광고 수신은 선택·기본 미선택으로 두고 필수 구매 동의와 묶지 않습니다. 결제 전에 실제 결과 수준을 이해할 수 있는 예시를 제공합니다.
이용약관에 넣을 항목
- 실제 사업자 정보와 적용일·버전.
- 서비스 범위: AI 가상 초상·창작 리포트, 포함 수량, 결과 형식, 개인적 이용 범위.
- 주문·결제·공급의 성립 시점, 생성 대기, 지연 안내, 완료 통지.
- 가격·세금·추가 결제·변경된 가격의 적용 기준.
- 이용 제한: 타인 개인정보·사진의 무단 입력, 서비스 남용 등 실제 적용 범위.
- 결과물 이용권과 상업적 재사용 범위. 사용한 공급사의 조건을 확인해 정함.
- 취소·청약철회·환불·생성 실패·불완전 공급 처리.
- 문의·분쟁 처리와 고객 권리 행사 방법.
- 서비스 중단·약관 변경 통지.
- 법령상 권리를 부당하게 제한하지 않는 책임 범위.
개인정보 처리 설계
첫 버전 목표는 최소한의 설문 응답, 주문·결제 확인 정보, 결과 접근용 세션입니다. 이메일 재접속을 도입하면 이메일과 토큰을 추가합니다. 카드번호·CVC를 우리 서버에 저장하지 않습니다.
| 정보 | 목적 | 운영 기간 제안/확인사항 |
|---|---|---|
| 미구매 설문 | 미리보기·주문 준비 | 서버에 저장한다면 예: 24시간, 확정 후 표시 |
| 구매 설문/결과 | 제작·고객 재열람 | 예: 30일 제공 후 삭제/익명화. 보관 상품 조건과 일치시킬 것 |
| 이메일 | 결과 링크·구매 문의 확인 | 고객지원/계약 정보 보존 필요와 분리해 확정 |
| 결제 거래기록 | 정산·환불·분쟁 | 적용 법령상 거래기록 보존 의무 확인 후 별도 보관 |
| 기술 로그 | 보안·장애 해결 | 최소 식별 정보, 짧은 기간, 접근권한 제한 |
| 광고 식별자 | 광고 성과 측정 | 초기에는 미사용. 도입 시 고지·동의와 전송 항목 검토 |
24시간/30일은 채택 전 제안이며 법정 보존 기간이라는 뜻이 아닙니다. 실제 보관 기간을 하나로 뭉뚱그리지 않습니다. 삭제 요청과 법정 보존 필요가 충돌하는 정보는 분리 보관과 접근 제한을 설계합니다.
처리방침에는 수집 목적·항목·근거·보유 기간, 이용자 권리, 파기 방법, 담당자, 처리 위탁, 국외이전이 있으면 해당 국가·수신자·목적·항목·시점/방법·기간·근거/거부 방법 등을 실제 계약과 흐름에 맞게 정리합니다. 국외이전은 무조건 하나의 동의 방식으로 해결된다고 가정하지 않습니다. 개인정보보호위원회 생성형 AI 안내서를 확인할 자료로 포함했습니다.
현재 시제품은 설문을 서버/외부 AI로 전송하지 않고 페이지 메모리에서만 사용합니다. 이메일 입력 화면은 있지만 주소를 서버로 전송·저장하지 않습니다. 사진은 받지 않습니다. 호스팅 자체의 접속 로그까지 전혀 없다고 주장하지 않습니다.
취소·환불 정책 원고 초안
운영안:
- 제작/공급 전: 취소 요청을 확인하고 주문 상태에 따라 결제 취소 절차를 진행합니다.
- 제작 실패/미제공: 재처리 또는 환불 선택 경로를 제공합니다. 중복 청구는 확인 후 환불합니다.
- 결과 제공 후: 적용 법령상 청약철회 가능 여부와 예외 요건을 확인해 처리합니다. 'AI로 만들었기 때문에 무조건 환불 불가'라고 안내하지 않습니다.
- 설명·광고/계약과 다른 제공: 일반적인 변심과 구분해 접수하고 법정 권리를 반영합니다.
- 접수 수단: [실제 지원 이메일 또는 문의 화면]에 주문 확인 수단과 사유를 접수. 카드번호나 불필요한 신분증은 요구하지 않습니다.
- 처리 시점: 접수 답변 목표와 PG 환불 처리·반영 시간을 계약 확인 후 공개합니다. 현재 확정된 기한을 꾸며 기재하지 않았습니다.
전자상거래법은 디지털콘텐츠의 제공 개시와 청약철회 예외에 관한 규정, 권리 행사가 방해받지 않도록 하는 표시·시험 사용 등의 조치를 규정합니다. 관련 조항의 적용은 실제 공급 방식과 고지/조치에 따라 확인해야 합니다. 관련 법령 조문 페이지, 공정위 사례. 링크에서 확인한 내용을 정리했으며, 출시 시 적용되는 최신 법령과 시행령은 다시 대조해야 합니다.
고객지원 답변 초안
결제했는데 결과가 없어요
“주문 확인 수단을 알려주시면 결제와 제작 상태를 확인하겠습니다. 확인 중에는 다시 결제하지 않으셔도 됩니다. 제작이 실패했거나 제공이 지연된 경우 재처리 또는 환불 가능한 방법을 안내하겠습니다.”
사진 속 사람이 실제 제 인연인가요?
“그림은 선택하신 취향을 바탕으로 만든 가상의 AI 창작 인물입니다. 실제 배우자나 특정 인물을 찾아내거나 미래의 만남을 예측하는 결과는 아닙니다.”
구독을 해지하고 싶어요
“이 서비스의 초기 상품은 자동 갱신 없는 1회 결제입니다. 고객님의 주문 내역에서 결제 횟수를 확인해드리겠습니다.”
위 문구는 우리 상품의 단건 구조를 전제로 한 초안입니다. 원본 Nebula의 계약 조건을 설명하는 문구가 아닙니다.
운영자 화면에 필요한 기능
주문번호 검색, 결제 상태 조회/대사, 작업 상태/오류코드, 마스킹한 고객 확인 수단, 실패 재생성, 환불 접수·PG 취소·상태 갱신, 결과 제공 이력, 문의 이력, 권한별 감사 로그. 관리자 버튼 클릭만으로 환불 완료가 되지 않도록 PG 응답을 검증합니다.
실행 순서·준비물·마케팅·출시 기준
먼저 결정할 사항
전체 작업을 시작하기 위한 질문 대신 아래 기본값으로 준비했습니다. 아직 확정한 사용자 결정으로 간주하지 않습니다.
| 결정 | 현재 가정 | 사용자가 나중에 바꿀 수 있는 것 |
|---|---|---|
| 시장/언어 | 한국/한국어 성인 | 해외 판매, 다국어 |
| 브랜드 | 연, 스케치(임시) | 상표/도메인 확인 후 변경 |
| 상품 | AI 가상 인연 그림 + 취향 리포트 | 사주/점성술 여부, 결과 분량 |
| 결제 | 단건 900원(2026-10-16 사용자 확정) | 가격, 재생성 포함 수량 |
| 운영자 | 미지정 | 실제 상호·대표자·사업자·고객지원 |
| 기술 | 정적 웹 + 운영 API 확장 | 기존 개발 스택·호스팅 재사용 |
지금 준비한 것
- 클릭 가능한 시작 화면과 장면형 설문 10개.
- 단일 선택 자동 이동, 장소별 후속 질문, 6단계 구성 연출, 이메일 입력·최종 주문 화면, 제작자용 결과·다운로드.
- AI 생성 가상 인물 샘플 2장과 화면 콘셉트 이미지.
- 기능 범위와 화면 카피, 서버/큐/DB 설계 초안.
- 서버 결제 검증 참조 코드와 단위 테스트.
- 이미지/텍스트 프롬프트, 출력 스키마, 품질 기준.
- 이용약관 구성안, 개인정보 처리 항목, 환불·CS 원고.
- 가격·기여액 계산 예시와 유입/광고 실험안.
- 실행 단계와 출시 전 QA 체크리스트.
사용자에게 남는 준비물
| 준비물 | 구체적 내용 | 직접 필요한 이유 |
|---|---|---|
| 브랜드·도메인 | 실제 사용할 이름, 보유 도메인 또는 구매할 도메인 선택 | 계정 소유권·비용·상표 판단 |
| 실제 판매자 정보 | 사업자/통신판매 관련 확인, 표시할 연락처·주소 | 임의로 생성할 수 없는 정보 |
| PG 계정과 계약 | 사업자 심사, 정산 계좌, 판매 상품 승인, 테스트/운영키 | 계약·심사·금융 정보 |
| AI 공급사 계정 | 상업 이용 조건/데이터 조건/예산 확인, 서버 비밀키 등록 | 유료 호출·계정 소유권 |
| 메일 발신 계정 | 지원 주소·발신 도메인 DNS 인증 | 사용자 소유 도메인 접근 |
| 운영 서버 자원 | DB·비공개 파일·큐·시크릿·상태 감시 | 정적 시제품에 없는 서버 기능 |
비밀번호나 전체 API 키를 채팅에 붙여넣을 필요는 없습니다. 실제 연결 단계에서 서버 비밀값 관리 기능으로 넣습니다. 도메인 구매, 유료 API 구독, PG 계약, 실제 결제는 이번 작업에서 하지 않았습니다.
개발 작업 순서
아래는 숙련 개발자가 AI 도구를 병행할 때의 작업량 가설입니다. PG 심사/도메인/계정 대기는 포함하지 않았고, 확정 납기나 견적이 아닙니다.
| 순서 | 작업 | 결과물 | 예상 작업량 |
|---|---|---|---|
| 1 | 상품·브랜드·샘플 수준 확정 | 수정된 화면/카피 | 0.5~1일 |
| 2 | 세션/퀴즈/주문 저장·권한 | 인증된 서버 API·DB | 1~2일 |
| 3 | PG 테스트키 연동·복구·대사 | 결제/취소 테스트 기록 | 1~3일 |
| 4 | 텍스트/이미지 생성·큐·재시도 | 주문별 결과/비용 기록 | 2~3일 |
| 5 | 결과 접근·재접속·메일·관리 | 고객/운영 흐름 | 1~2일 |
| 6 | 정책 확정·모바일/장애 QA | 출시 체크 통과 | 1~2일 |
전체는 대략 6.5~13 작업일의 초안입니다. 실제 소요는 실패 복구와 심사 조건에 따라 달라질 수 있습니다. 한 주 안에 출시한다고 약속하기보다, 유료 결제와 결과 제공의 실패 경로를 먼저 닫습니다.
계측 이벤트 설계
| 이벤트 | 발생 시점 | 허용 예시 필드 |
|---|---|---|
| landing_view | 시작 화면 첫 표시 | experiment_id, content_version |
| quiz_start | 시작 클릭 | anonymous_session_id |
| quiz_step_complete | 질문 다음 단계 이동 | step_number, elapsed_bucket |
| preview_view | 예시 화면 | variant_id |
| checkout_view | 주문 설명 표시 | sku, price_version |
| payment_started | PG 이동 | 내부 order_id |
| payment_confirmed | 서버 PAID 확정 | 내부 order_id, amount, currency |
| generation_succeeded/failed | 서버 작업 종료 | job_id, model_id, latency_bucket, error_code |
| result_view | 권한 있는 결과 열람 | 내부 order_id |
| refund_confirmed | PG 환불 확인 | 내부 order_id, reason_category |
설문 답·이메일·초상 접근 URL·결제 key를 분석 도구에 전송하지 않습니다. 서버 이벤트를 매출 기준으로 사용하고 주문 ID로 중복을 제거합니다. 현재 시제품에는 분석 SDK를 넣지 않았습니다.
확인할 숫자
- 방문→설문 시작률 = 중복 제거된 설문 시작 세션 / 랜딩 세션.
- 설문 완료율 = 미리보기 도달 세션 / 설문 시작 세션.
- 결제 전환율 = 서버 PAID 주문을 가진 세션 / 주문 화면 세션.
- 구매당 광고비 = 해당 코호트 광고비 / 환불 반영 구매자 수. 집계 기간·환불 반영 기준을 고정.
- 결과 제공 성공률 = 목표 시간 내 결과가 제공된 주문 / 결제 확정 주문.
- 환불률 = 충분한 관찰 기간이 지난 주문 중 환불 주문 비율. 최근 주문과 섞어 낮춰 보지 않음.
- 주문당 기여액 = 실제 계약 비용·재시도·CS·환불·광고비 반영. 고정비·세금 처리도 별도 기록.
미리 전환율 5% 또는 정확도 99%라고 광고하지 않습니다. 첫 유료 고객의 정상 공급·문의·환불 기록으로 원인부터 확인합니다.
광고 원고 초안
과장된 예언이나 실제 후기 없이 제작할 수 있는 소재입니다. 사진·유명인·후기를 추가로 쓰려면 해당 사용권부터 확인합니다.
- “어떤 한마디에 마음이 먼저 움직일까?” — 선택지 전환 → 샘플 초상 → AI 창작 표시.
- “이상형을 말로 설명하기 어렵다면.” — 분위기·관계 가치 선택 → 초상 한 장.
- “따뜻한 사람, 차분한 사람. 나는 어떤 분위기에 끌릴까?” — 두 스타일의 가상 인물 비교.
- “친구와 서로 다른 인연 스케치를 골라봤어요.” — 실제 촬영/체험을 진행한 경우에만 경험담 형식 사용.
- “대화, 신뢰, 응원. 내가 좋아하는 관계는?” — 외모보다 관계 취향에 초점.
- “한 장의 그림으로 상상하는 인연.” — 생성 예시와 가격·단건 표시.
15초 영상 구성안: 0~3초 질문 → 3~7초 설문 2개 → 7~11초 스케치 등장 → 11~15초 제공물과 CTA. 마지막 화면에 AI 창작 콘텐츠라는 성격을 알아볼 수 있게 표시합니다. 실제 운영 전인 지금은 '곧 오픈'·'샘플 체험' 소재만 쓸 수 있습니다.
광고비 집행은 하지 않았습니다. 테스트 예산을 정할 때는 먼저 주문당 허용 획득비와 손실 상한을 정하고, 한 번에 가격·카피·초상 스타일을 모두 바꾸지 않습니다.
출시 전 체크리스트
상품·콘텐츠
- ☐ 서비스 이름·도메인·상표/사용권 확인.
- ☐ 실제 생성 결과 최소 20개 이상 검토, 공급사별 실패/지연/비용 측정.
- ☐ 샘플과 실제 제공 수준 일치.
- ☐ 미래 예측·정확도·가짜 후기·가짜 할인·가짜 카운트다운 없음.
- ☐ 판매가·포함 수량·제공 시점·다운로드/재접속 기간 확정.
결제·서버
- ☐ 사업자/PG 심사 완료, 테스트키와 운영키 분리.
- ☐ 성공/실패/취소/중복/타임아웃/대사 테스트.
- ☐ 주문 소유권과 서버 가격 검증.
- ☐ PAID + outbox 원자 기록, 작업 중복 방지, 큐 복구.
- ☐ 생성 실패 시 고객 안내·재처리·환불 경로.
- ☐ 운영 환경 소액 실결제/취소를 계정 소유자가 수행하고 정산 기록 확인.
개인정보·운영
- ☐ 실제 사업자와 지원 연락처를 페이지에 표시.
- ☐ 정식 약관·개인정보·청약철회·환불 정책 확정.
- ☐ 실제 공급사·위탁·국외이전·보관 기간 확인.
- ☐ 비공개 이미지·세션/결과 접근 제어·토큰 만료/재발급.
- ☐ 로그 마스킹·비밀키 관리·권한·삭제/거래기록 보존 분리.
- ☐ 지원 접수·답변 담당자·장애 알림·일별 결제 대사.
화면·접근성
- ☐ iPhone Safari, Android Chrome, 데스크톱 Chrome/Safari/Edge 확인.
- ☐ 모바일 좁은 폭, 확대, 한글 줄바꿈, 화면 회전 확인.
- ☐ 키보드 이동·스크린리더 라벨·오류 초점·대화상자 종료 확인.
- ☐ 앱 전환 후 PG 복귀, 뒤로 가기, 새로고침, 이중 클릭 확인.
- ☐ PNG·리포트 다운로드와 결과 재접속 확인.
개발 도구에 그대로 전달할 실행 프롬프트
이 저장소의 README와 docs/01-product.md~05-launch.md를 먼저 읽어라.
연, 스케치는 한국어 성인을 위한 AI 가상 인물 스케치 + 취향 리포트 단건 서비스다.
현재 dist는 실결제 없는 정적 시제품이며 그림은 고정 샘플이다.
원본 Nebula의 가격·설문·결제 조건은 검증되지 않았으므로 사실처럼 구현하지 마라.
기존 디자인 토큰과 반응형 화면을 유지하고, 실제 서버 기능을 순서대로 연결하라.
1. 세션/CSRF/선택지 allowlist, 주문 소유권, 서버 SKU 가격을 구현하라.
2. schema.sql의 의도를 검토해 실제 DB migration과 저장소 어댑터를 구현하라.
3. PG 테스트키를 비밀값 저장소에서 읽고 결제 승인·조회 대사·취소를 연결하라.
4. 주문별 실행 제어, PAID+outbox 원자 기록, 큐 재시도와 작업 lease를 구현하라.
5. docs/03-ai-prompts.md의 구조화된 텍스트·이미지 생성과 서버 검증을 연결하라.
6. 결과 비공개 저장·인증된 조회·만료 링크·메일 재접속을 연결하라.
7. 고객지원/재생성/환불 관리와 감사 기록을 구현하라.
8. 실패 복구·금액 변조·타인 접근·중복 콜백·환불·모바일 PG 복귀를 검증하라.
외부 API 문법은 선택한 공급사의 최신 공식 문서로 확인하라.
공급사 계정/키/심사가 없으면 샘플 모드로 남기고 실제 연동 완료라고 말하지 마라.
유료 API 호출·도메인 구매·운영 결제는 확정된 계정과 예산 범위에서만 진행하라.
현재 sample 표시를 제거하는 조건은 실제 결제·주문별 생성·접근 제어·정책·QA가 완료된 때다.
필수 수동 결정은 docs/05-launch.md 표에 남기고, 독립적으로 가능한 구현은 계속해라.검증 기록과 확인하지 못한 부분
작성일: 2026-10-15.
실행한 검사
- Node.js가 프런트·데이터·서버 참조 모듈을 구문 분석하는지 확인.
- 설문 10문항의 핵심 인물·나이·분위기·가치·장소 5개 축에 대한 243개 조합에서 리포트 본문이 생성되는지 확인. 전체 설문 응답 조합을 모두 검사했다는 뜻은 아닙니다. 장소별 후속 질문 3종, 실제 6단계 로컬 처리 파이프라인, 팝업 응답 16개 조합의 리포트 유효성도 검사했습니다. 팝업 열림·닫힘과 타이머 재개는 브라우저 검증 전입니다.
- 시제품 코드가 fetch/브라우저 영속 저장소를 사용하지 않는지 정적 확인.
- 필요한 HTML·CSS·이미지·문서·배포 설정 파일 존재와 링크/경로 확인.
- 결제 참조 모듈 단위 테스트 9개 통과: 서버 가격, 금액 변조, 세션 불일치, 중복 승인, 동시 승인 계약, paymentKey 불일치, PG 응답 불일치, 타임아웃 후 복구 필요 상태, 미결제 생성 차단.
- SQLite 스키마를 임시 메모리 DB에 적용해 문법·테이블 생성 확인.
- 화면 콘셉트와 실제 사용할 두 인물 샘플을 이미지 뷰어로 확인.
시각 구현 기준과 대조 상태
| 대조점 | 콘셉트 기준 | 구현 | 검증 상태 |
|---|---|---|---|
| 팔레트 | cream #f8f5ef, ink #292927, olive #666b4c | CSS 변수 고정 | 코드 수준 확인. 렌더 이미지 비교 미실시 |
| 제목·버튼 | '아직 만나지 않은, 당신의 인연을 그려요.' / '나의 인연 그려보기' | 텍스트 일치 | 소스 문구 확인 |
| 구성 | 좌측 문구, 우측 기울어진 초상 2장 | CSS grid, 겹친 paper card | 브라우저 화면 확인 미실시 |
| 이미지 | 가상 성인 연필 초상, 종이 질감 | 별도 AI 샘플 2장 | 자산을 이미지 뷰어로 확인. 콘셉트와 다른 인물 사용은 의도된 차이 |
| 서체 | 한국어 명조 제목·산세리프 UI | OS 서체 fallback | 외부 웹폰트 미사용. OS별 실제 모양 미확인 |
| 단계 | 01 취향 / 02 스케치 / 03 보관 | 3개 순서 영역 | 소스 내용 확인 |
| 모바일 | 읽을 수 있는 단일 열 | 620px 이하 사진→제목→버튼, 순서 세로 표시 | media query 확인. 실기기 테스트 미실시 |
| 표현 차이 | 식물 선 장식 | 폰트 장식기호로 단순화 | 의도된 차이. 전용 식물 래스터 추가 미진행 |
| 안내 | 콘셉트의 AI 창작 설명 | 추가로 footer 샘플 체험 표시 | 실제 기능 상태를 알리기 위한 의도적 추가 |
콘셉트 경로: docs/design-concept.png. 전체 콘셉트는 이미 생성 후 이미지 뷰어로 확인했습니다. 코드 네이티브 텍스트와 컨트롤을 구현했으며 콘셉트 스크린샷을 UI로 쓰지 않습니다.
브라우저 검증 (2026-10-15 추가)
npm run qa(scripts/qa.mjs)가 로컬 서버를 띄우고 설치된 Chrome을 headless로 실행해 데스크톱(1280×800)과 모바일(390×844, 터치·2x)에서 다음을 실제 클릭으로 확인합니다. 모두 통과했습니다.
- 단일 선택 9문항은 다음 버튼 없이 즉시 다음 질문으로 이동, 복수 선택 1문항은 3번째 선택이 막히고 '다 골랐어요'로 이동.
- 구성 연출: 팝업 대기 시간을 뺀 연출 시간 10.9~11.0초, 예/아니오 팝업 정확히 4개, 답한 뒤 연출 재개. 모바일에서 '기다리지 않고 계속' 경로도 확인.
- 이메일: 잘못된 주소는 다음으로 넘어가지 않고, 올바른 주소 입력 후 구매 화면에 가격 900원과 이메일 표시.
- 결제 버튼은 '결제 연결 준비 중' 안내만 표시(청구 없음).
- 샘플 결과의 PNG 저장(유효한 PNG)과 이야기 TXT 저장.
- 모든 화면에서 가로 넘침 없음, 콘솔 오류 없음, CSP 헤더 적용 상태에서 위반 없음.
스크린샷은 qa-output/(Git 제외)에 남습니다. 스크린샷 안정성을 위해 reduced-motion으로 실행하므로 0.35초 진입 애니메이션 자체는 이 점검 범위 밖입니다. 키보드/스크린리더 탐색, Safari/iOS 실기기, 콘셉트 이미지와의 픽셀 비교는 아직 하지 않았습니다.
참고: 화면을 그리지 않는(가려진) 브라우저 창에서는 Chromium이 dialog close 이벤트를 다음 프레임까지 보류해 팝업 응답 후 연출이 멈춘 것처럼 보일 수 있습니다. 화면이 그려지면 즉시 이어지며 실제 사용 환경의 결함은 아닙니다.
참고 사이트를 읽기 위해 사용한 별도 클라우드 브라우저에서는 Nebula의 본문이 표시되지 않았습니다. 이 관찰은 우리 구현의 브라우저 테스트가 아닙니다.
운영 전 미완료 항목
실제 PG 인증/승인/조회/환불, 영속 저장소와 거래, 주문별 실행 제어, 작업 큐, 실시간 AI 생성, 이메일 서버 저장/발송, 결과 인증/복구, 관리자, 분석/오류 감시, 정식 정책 확정은 미완료입니다. 참조 모듈과 SQL이 있다는 이유로 운영 준비가 끝난 것으로 간주하지 않습니다.
배포가 성공하면 소유자만 접근하는 시제품으로 검토할 수 있습니다. 공개 유료 판매용 사이트라는 의미가 아닙니다.
참고 출처와 확인 범위
확인일: 2026년 10월 15일. 검색 결과/공식 문서와 브라우저 관찰을 구분했습니다.
| 출처 | 주소 | 이번 작업에 사용한 범위 |
|---|---|---|
| 사용자 제공 결제 URL | https://appnebula.co/ko/soulmate-sketch/trialPayment | 브라우저 제목은 표시됐으나 본문은 빈 화면. 가격/약관 미확인 |
| 사용자 추가 시작 URL | https://appnebula.co/ko/soulmate-sketch/prelanding | 빈 제목·버튼 영역과 개인정보/약관 링크 관찰. 실제 문구/이미지는 미표시 |
| Nebula 공식 Soulmate Reading | https://www.asknebula.com/soulmate-reading | 상담형 인연 콘텐츠를 소개하는 공개 페이지. 사용자 제공 결제 상품과 동일 조건이라고 단정하지 않음 |
| Toss 결제 흐름 | https://docs.tosspayments.com/guides/v2/get-started/payment-flow | 요청/인증/승인, 주문과 금액 저장·검증 |
| Toss 주문서형 결제 연동 | https://docs.tosspayments.com/guides/v2/payment-widget/integration | SDK/위젯, 테스트키, 서버 승인 절차 |
| Toss Core API | https://docs.tosspayments.com/reference | 결제 상태·승인/취소 객체와 엔드포인트 |
| 국가법령정보센터 조문 페이지 | https://www.law.go.kr/LSW/lsLawLinkInfo.do?chrClsCd=010202&lsId=009318&lsJoLnkSeq=1000527300&print=print | 디지털콘텐츠 청약철회 예외·표시·시험 사용 관련. 출시 시 최신 시행 법령 재대조 필요 |
| 국가법령정보센터 공정위 사례 | https://www.law.go.kr/LSW/ftcInfoP.do?ftcSeq=14785 | 디지털콘텐츠 제공과 청약철회, 표시/광고·계약 불일치 구분 |
| 개인정보보호위원회 생성형 AI 안내서 게시 페이지 | https://www.privacy.go.kr/front/bbs/bbsView.do?bbsNo=BBSMSTR_000000000049&bbscttNo=20836 | 생성형 AI 개인정보 처리 관련 공식 검토 자료가 있음을 확인. 첨부 PDF 전문 분석은 하지 않음 |
원본 사이트의 매출, 전환율, 한국어 체험 가격, 자동 갱신 가격, 실제 스케치 제작 주체는 이번 조사에서 확인하지 못했습니다. 검색에 등장한 앱스토어 구독 상품이나 이용자 후기를 사용자 제공 웹 결제 상품의 사실로 대체하지 않았습니다.
설문 리서치와 개편 기록
2026-10-15 개편. 사용자 요구: 단일 선택 자동 이동, 장면과 대사 중심의 재미있는 설문, 전체 문항 수를 드러내지 않는 구성, 상세한 중간 화면, 이메일 입력 후 최종 결제 페이지.
확인한 자료와 적용 범위
| 자료 | 확인한 내용 | 적용 | 한계 |
|---|---|---|---|
| Typeform, Quiz question design (2026-09-03) | 짧고 대화체인 질문, 가벼운 시작, 이전 답에 따른 후속 질문, 모바일에서 누르기 쉬운 선택지 권고 | 한 화면 한 질문, 대사형 선택지, 장소별 후속 장면 | 공급사 실무 가이드. 우리 서비스의 전환 개선을 입증하는 실험은 아님 |
| Typeform, 11 proven tips (2025-03-27) | 질문의 필요성, 이전 답을 다시 활용하는 대화, 목적에 맞는 문구와 진행 안내 권고 | 처음 고른 대사를 마지막 리포트에서 다시 연결 | 이 가이드는 진행 안내를 권고함. '진행률을 숨기면 좋다'는 근거로 인용하지 않음 |
| Aron et al. (1997), Experimental Generation of Interpersonal Closeness | 45분간 점차 깊어지는 자기 개방 과제를 수행한 사람 쌍의 실험. 연구 1에서 비교 과제보다 높은 상호작용 후 친밀감 보고 | 가벼운 장면→표현 방식→관계 가치로 질문의 깊이를 점진적으로 조절하는 디자인 참고 | 사람 간 대화 실험이며, 혼자 하는 웹 설문·매출·궁합 정확도 검증은 아님 |
| Loewenstein (1994), Psychology of Curiosity | 알고 있는 것과 알고 싶은 것의 간극을 호기심과 연결하는 이론 | 구체적인 대사와 장면을 먼저 제시하고, 선택으로 이어질 이야기를 궁금하게 만드는 디자인 가설 | 종료 지점 은폐, 긴 대기, 결제 유도가 검증됐다는 뜻이 아님 |
| Typeform 공식 Progress bar 도움말 | 진행률 표시를 켜고 끌 수 있고 분기 경로에서는 표시가 앞뒤로 달라질 수 있음 | 숫자 대신 현재 장면 제목만 보여주는 요청 구현에 참고 | 숨긴 방식이 우수하다는 실증 근거는 아님 |
아래 주소의 원문·공식 초록을 확인했습니다. Loewenstein PDF는 검색 요약으로 이론 요지를 확인하고 대학 저장소의 문서를 열어 존재를 확인했으며 전문 텍스트 추출은 제공되지 않았습니다.
- https://www.typeform.com/blog/response-rates-effective-question-phrasing
- https://www.typeform.com/blog/create-better-typeforms
- https://journals.sagepub.com/doi/10.1177/0146167297234003
- https://www.cmu.edu/dietrich/sds/docs/loewenstein/PsychofCuriosity.pdf
- https://help.typeform.com/hc/en-us/articles/360051557892-Activate-the-Progress-bar
질문 원고는 위 자료의 문항을 복제하지 않고 새로 작성했습니다. 이 웹 설문은 심리검사나 인연 예측 도구로 검증되지 않았습니다.
실제 변경
- 10개 질문. 총 문항 수·몇 번째인지·진행률을 UI에 노출하지 않음. 주제 제목은 표시.
- 단일 선택은 버튼 클릭 후 160ms의 선택 피드백을 거쳐 바로 이동. 키보드 Enter/Space로도 버튼 사용 가능.
- 디테일 질문 하나만 복수 선택, 1~2개 선택 후 '다 골랐어요'. 선택 상한과 오류 안내.
- 뒤로 가서 같은 답을 다시 눌러도 이동 가능. 장소를 바꾸면 연결된 후속 답은 초기화.
- 답변 정리·키워드 연결·리포트 구성·형식 확인 등 실제 로컬 작업 6단계를 약 10.8초의 연출로 제시. 중간에 예/아니오 질문 4개가 레이어 팝업으로 열리고, 팝업 응답 시간은 10.8초에 포함하지 않음.
- '기다리지 않고 계속'은 남은 로컬 작업을 즉시 수행하고 이메일 화면으로 이동.
- AI 서버 호출 없이 AI 분석/검토 완료를 주장하지 않음. 새 초상 생성 대기라고 표시하지 않음.
- 설문→이야기 구성→이메일→최종 결제 페이지. 이메일은 페이지 메모리에서만 처리하고 서버 저장/발송 없음.
- 최종 버튼은 PG 연결 전 상태를 안내. 실제 결제 성공 화면으로 위장하지 않음. 제작자용 샘플 결과는 별도 링크.
비교할 실험
출시 후 짧은 설문 대비 새 설문의 질문별 이탈, 설문 완료, 이메일 단계 도달/입력 완료, 결제 전환, 환불과 문의를 같은 유입 코호트로 비교합니다. 진행률 유무·대기 연출 길이·질문 원고는 별도 변수로 비교하며 효과를 미리 단정하지 않습니다.
팝업 원고: “운명을 믿으시나요?”, “처음 본 사람에게, 이유 없이 끌린 적 있나요?”, “우연히 두 번 마주치면, 이번엔 말을 걸어볼 건가요?”, “지금 이 장면을 함께 떠올린 사람이 있나요?”. 닫기/ESC는 건너뛰기이며 남은 로컬 처리를 이어갑니다. 답은 관계 이야기 문구에 반영하고, 특정 실제 인연이라는 추정에는 사용하지 않습니다.
현재는 분석 SDK가 없고 실제 실험도 수행하지 않았습니다. 연출 시간이 길어 이탈이 늘면 줄여야 하며, 오래 머문 시간을 성공 지표로 단독 사용하지 않습니다.
독립 개발·도메인 연결
2026-10-15 사용자 확정: 기존 서비스와 도메인만 공유하고 독립적으로 개발한다.
개발 경계
이 프로젝트는 ONDO/fortune 앱의 하위 모듈이 아니다. 프런트 소스, 서버 참조 코드, 배포 이력, 환경변수와 향후 주문 DB를 별도로 관리한다. fortune의 Next.js, Expo, Supabase 또는 계정을 실행 의존성으로 사용하지 않는다.
진입점은 dist/index.html이며 자체 호스트의 /에서 실행한다. fortune/apps/web/public에 복사하거나 fortune의 미들웨어 및 라우팅에 붙이는 방식은 사용하지 않는다. 이전 통합 브랜치는 로컬에만 있으며 이 독립 배포 작업에서 push/merge하지 않는다.
연결 상태
- 현재 검토 주소: https://yeon-sketch-studio.injoo.chatgpt.site
- 연결 등록한 호스트:
sketch.zpzg.co.kr - 도메인 등록 ID:
appgdom_6ad0b6d2d8488191ae4a60ebeecaa817 - 등록 결과: pending, SSL initializing. DNS 등록·전파·인증 완료를 의미하지 않는다.
- 현재 검토 사이트는 소유자 전용 접근을 유지한다. 공개 방문 서비스 전환은 별도 접근 설정이 필요하다.
호스팅 도구가 반환한 다음 레코드를 실제 권한 있는 DNS 제공자에 추가해야 한다. 루트/ONDO 레코드와 MX 등 기존 레코드는 변경하지 않는다.
| 유형 | 전체 이름 | 값 |
|---|---|---|
| CNAME | sketch.zpzg.co.kr | custom-domains.chatgpt.site. |
| TXT | _openai-site-verification.sketch.zpzg.co.kr | openai-site-verification=GVisbUzpcBggKXzo2-3DymZ1xt8M91X7sNR3SQB-zEU |
| TXT | _cf-custom-hostname.sketch.zpzg.co.kr | 26a237d1-abf0-4ad1-9efc-655a7da7009e |
Vercel의 기존 fortune 프로젝트 조회는 현재 연결의 팀 범위 권한 부족으로 403을 반환했다. Vercel CLI는 이 환경에 설치되어 있지 않다. DNS를 변경하거나 인증 성공을 확인하지 못했다.
2026-10-15 Vercel 배포 상태
- Vercel 프로젝트
yeon-sketch(개인 Hobby 범위, fortune 프로젝트와 별개)가 GitHubinjooinjoo/yeon-sketch의main에 연결됨. push하면 프로덕션에 자동 배포된다. - 프로덕션 주소: https://yeon-sketch.vercel.app (공개 접근).
- 실측:
vercel.json의 CSP·Referrer-Policy·nosniff·Permissions-Policy 헤더 적용,dist/만 제공되고backend/·docs/·package.json은 404. QA_BASE_URL=https://yeon-sketch.vercel.app/ npm run qa로 데스크톱·모바일 E2E 통과.- 커스텀 도메인
sketch.zpzg.co.kr은 아직 추가·DNS 등록 전.
2026-10-15 독립 개발 환경 구성 후 확인
- 로컬 저장소
C:\dev\yeon-sketch(Gitmain)로 분리. fortune 저장소는 수정하지 않음. - 실행:
npm run dev(의존성 없는 정적 서버, http://localhost:4173),npm run check,npm test,npm run qa(headless Chrome E2E). - ChatGPT Sites 바인딩 파일
.openai/hosting.json은 ZIP에서 제외돼 있어, 검사 대상 배포 설정을vercel.json(출력dist, CSP·Referrer-Policy 등 보안 헤더)으로 바꿨다. 로컬 서버도 같은 헤더를 적용한다. - DNS 실측(Google DNS-over-HTTPS):
zpzg.co.kr의 네임서버는 Gabia, 루트 A는216.198.79.1(Vercel).sketch.zpzg.co.kr의 CNAME과 위 두 TXT 레코드는 존재하지 않음(NXDOMAIN). 즉 DNS 등록부터 미완료다. - 기존 검토 주소는 HTTP 401(소유자 전용)을 반환한다.
2026-10-15 사용자 결정: 호스팅은 새 Vercel 프로젝트로 한다. 아래 ChatGPT Sites용 레코드는 더 이상 사용하지 않는다. 새 Vercel 프로젝트(yeon-sketch, 루트 디렉터리 /)를 GitHub 저장소에 연결하고 도메인 sketch.zpzg.co.kr을 추가한 뒤, Vercel이 표시하는 실제 레코드를 Gabia DNS에 sketch 서브도메인으로만 추가한다. 그 경우 위 ChatGPT Sites용 CNAME/TXT는 추가하지 않는다. 루트·MX 레코드는 건드리지 않는다.
운영 기능 상태
기존 설문, 단일 선택 자동 이동, 중간 팝업 4개, 이메일 다음 구매 화면, 샘플 결과를 유지한다. 결제/주문별 AI 생성/메일 발송은 여전히 미연결이다. 현재 정적 배포는 backend 폴더를 실행하지 않는다.
2026-10-16 커스텀 도메인 연결 완료
가비아 DNS에 sketch CNAME을 51648c5ebdde5fa8.vercel-dns-017.com.으로 저장했다(TTL 600). Vercel의 yeon-sketch 프로젝트에서 Valid Configuration을 확인했고, HTTPS 인증서 검증과 실제 홈페이지 표시를 확인했다. 루트 A 및 www CNAME은 기존 값을 유지했다.
2026-10-16 화면 및 구매 구성
감성적인 편지 콘셉트의 첫 화면과 마지막 주문 화면을 적용한다. 사용자 확정 가격은 900원, 1회 결제이며 자동 갱신은 없다. Stripe 선택은 철회되었고 설치·약관 동의·계정 생성은 진행하지 않았다. 기존 비욘드 사업자의 토스 계약에서 이 서비스의 사이트/상품 범위 또는 별도 MID를 확인한 뒤 토스 연동을 진행한다. 현재 배포물은 실결제·새로운 AI 이미지 생성·이메일 발송을 제공하지 않는다.