Skip to content
jeonga1022 edited this page Aug 28, 2026 · 7 revisions

케미로그 PRD

1. 제품 개요

제품명

케미로그 (ChemiLog)

한 줄 소개

둘 또는 여러 명이 같은 랜덤 질문에 각자 답하고, 답변을 비교해 서로의 케미 점수와 모임 안에서의 관계 순위를 확인하는 모바일 웹 우선 소셜 서비스.

핵심 질문

"우리 둘은 얼마나 잘 맞을까?"
"우리 모임에서 가장 케미가 좋은 조합은 누구일까?"

핵심 목표

  • 회원가입 없이 빠르게 참여합니다.
  • 링크 하나로 친구 또는 모임 구성원을 초대합니다.
  • 짧은 2지선다 질문만으로 결과를 확인합니다.
  • 제품 정책상 방 참여 인원에 상한을 두지 않습니다. MVP 성능 보장 범위는 별도로 정의합니다.
  • 참여자가 늘어날수록 새로운 케미 조합과 순위가 생성됩니다.
  • 결과 공유와 부가 콘텐츠를 통해 재방문을 유도합니다.

제품 성격

케미로그의 케미 점수는 답변 유사도를 재미있게 보여주는 지표입니다. 낮은 점수는 관계가 나쁘다는 뜻이 아니라 선택과 성향의 차이가 크다는 뜻으로 안내합니다.

2. 문제와 가치

해결하려는 문제

친구, 커플, 동료, 모임 구성원은 서로를 잘 안다고 생각하지만 실제 취향이나 선택 기준이 얼마나 비슷한지 짧은 질문으로 확인할 도구가 부족합니다. 기존 테스트형 콘텐츠는 대부분 1회성 개인 결과에 머물러, 여러 사람이 참여할수록 결과가 확장되는 재미가 약합니다.

사용자 가치

  • 답변만 하면 바로 케미 점수를 볼 수 있습니다.
  • 친구가 참여할수록 새로운 조합과 순위가 생깁니다.
  • "우리 의외로 잘 맞네", "여행은 안 맞네" 같은 대화 소재를 만듭니다.
  • 별도 가입 없이 링크 공유만으로 참여 장벽을 낮춥니다.

제품 가치

  • 방 단위 공유 구조로 자연스러운 바이럴 루프를 만듭니다.
  • 2인 결과와 그룹 결과를 같은 데이터 모델로 확장할 수 있습니다.
  • 질문팩, 기록, 타로, 컬렉션으로 장기 확장이 가능합니다.

3. 타깃 사용자 및 핵심 시나리오

주요 사용자

  • 친구와 가벼운 테스트를 즐기는 10대 후반부터 30대 사용자
  • 단톡방, 동아리, 회사 동료, 스터디 등 소규모 모임 구성원
  • 커플 또는 썸 관계에서 재미용 궁합 테스트를 원하는 사용자

핵심 시나리오

  • 사용자 A가 케미방을 만들고 먼저 12개 질문에 답합니다.
  • 방이 OPEN 상태가 되면 사용자 B에게 초대 링크를 보냅니다.
  • 사용자 B가 사용자 A와 동일한 12개 질문에 답합니다.
  • 두 사람의 전체 케미와 카테고리별 케미가 공개됩니다.
  • 사용자 C와 사용자 D가 같은 링크로 추가 참여합니다.
  • 총 4명의 모든 Pair 결과가 계산되고 그룹 케미 순위가 갱신됩니다.
  • 사용자는 결과를 공유하거나 새 케미방을 만듭니다.

4. 모바일 우선 UX 원칙

케미로그는 모바일 웹을 1차 플랫폼으로 설계합니다. 데스크톱은 보조 환경으로 지원합니다.

  • 최소 지원 화면 폭은 360px 이상으로 합니다.
  • 한 화면에는 한 질문만 보여 줍니다.
  • 2지선다 선택지는 엄지 조작이 쉬운 큰 버튼으로 제공합니다.
  • 주요 CTA는 화면 하단에 고정합니다.
  • 하단 고정 CTA는 모바일 브라우저의 safe area를 반영하고, 키보드가 열렸을 때 입력 필드나 선택지를 가리지 않아야 합니다.
  • 모든 주요 터치 영역은 최소 44px 이상으로 합니다.
  • 질문 진행률을 1 / 12 형태로 명확히 보여 줍니다.
  • 뒤로 가기, 새로고침, 브라우저 재접속 시 사용자가 진행 상태를 잃지 않도록 처리합니다.
  • 공유는 Web Share API를 우선 사용하고, 지원하지 않는 브라우저에서는 링크 복사 fallback을 제공합니다.
  • 로딩, 빈 상태, 오류 상태를 각각 명확한 화면으로 제공합니다.
  • 색상만으로 정답, 점수, 상태를 구분하지 않습니다.
  • 텍스트는 모바일 폭에서 줄바꿈되어야 하며 가로 스크롤이 발생하지 않아야 합니다.
  • 폼 입력, 버튼, 결과 카드는 스크린리더가 의미를 이해할 수 있는 레이블을 가집니다.

5. 핵심 사용자 흐름

케미방 생성
  ↓
방 단위 랜덤 질문 세트 생성
  ↓
방장 답변 제출
  ↓
친구 / 모임 구성원에게 링크 공유
  ↓
참여자가 동일 질문 세트에 답변
  ↓
참여자 간 Pair 케미 계산
  ↓
2인 케미 또는 그룹 케미 결과 확인
  ↓
결과 공유 / 새 케미방 생성

방장은 첫 번째 참여자입니다. MVP에서는 방장에게 별도 관리자 권한을 제공하지 않습니다.

방 생성 직후 상태는 HOST_ANSWERING입니다. 생성자가 12개 답변을 제출하면 방은 OPEN으로 전환되고 초대 링크 공유 CTA가 노출됩니다. HOST_ANSWERING 상태의 링크에 다른 사용자가 접근하면 참여 화면 대신 "방을 준비하고 있어요" 상태를 보여 줍니다.

6. 이용 모드

6.1 2인 모드

답변을 완료한 참여자가 2명일 때 두 사람의 Pair 결과를 제공합니다.

예시:

사용자 A x 사용자 B
전체 케미 83점
대화 100
여행 67
생활 100
소비 67

제공 결과:

  • 전체 케미 점수
  • 카테고리별 케미 점수
  • 가장 잘 맞는 카테고리
  • 가장 다른 카테고리
  • 같은 선택 수
  • 다른 선택 수는 MVP에서 제공하지 않습니다(15장 참고).
  • 낮은 점수에 대한 관계 비하 방지 안내 문구

가장 잘 맞는 카테고리와 가장 다른 카테고리는 최고점 또는 최저점에 해당하는 카테고리를 모두 보여 줍니다. 네 카테고리 점수가 모두 같아 같은 카테고리들이 최고이자 최저인 경우에는 특정 최고/최저 없음으로 보여 줍니다.

6.2 그룹 모드

답변을 완료한 참여자가 3명 이상이면 모든 참여자 조합의 Pair 결과를 계산하고 그룹 순위를 제공합니다.

Pair 개수 공식:

N명의 참여자 → N(N-1)/2개의 Pair

예시:

4명 참여 → 4(4-1)/2 = 6개 Pair

사용자 A x 사용자 B
사용자 A x 사용자 C
사용자 A x 사용자 D
사용자 B x 사용자 C
사용자 B x 사용자 D
사용자 C x 사용자 D

제공 결과:

  • 전체 케미 TOP 3
  • 카테고리별 1위
  • 가장 비슷한 조합은 전체 케미 TOP 1 Pair와 같으므로 별도로 표시하지 않습니다.
  • 반전 케미 조합
  • 내 Pair 목록

전체 케미 TOP 3은 순위 구간 3개가 아니라 안정 정렬된 Pair를 최대 3개까지 뜻합니다. 컷오프 점수에 동점자가 더 있어도 3개까지만 노출하되, 노출된 Pair의 공동 순위 번호는 유지합니다.

카테고리별 결과는 카테고리마다 대표 Pair 1개와 공동 1위 Pair 수를 보여 줍니다. 대표 Pair는 해당 카테고리의 공동 최고 Pair 안에서만 정규화된 참여자 A 닉네임, 참여자 B 닉네임 오름차순의 첫 Pair로 정합니다. 전체 케미 점수는 대표 선택에 사용하지 않습니다.

가장 다른 조합은 전체 점수가 가장 낮은 Pair입니다. MVP 화면에서는 제공하지 않습니다. 친구 사이를 가장 맞지 않는 조합으로 지목하는 콘텐츠이므로, 11장의 그룹 결과 목록에서도 제외합니다.

MVP에서는 현재 시점의 순위를 보여 줍니다. "새로운 1위 등장", "TOP 3 신규 진입" 같은 순위 변화 히스토리는 추후 확장으로 분리합니다.

7. 방 및 참여자 비즈니스 규칙

케미방

  • 케미방은 공유 코드로 식별합니다.
  • 공유 코드는 추측하기 어려워야 합니다.
  • 케미방은 공유 링크를 통해서만 발견할 수 있습니다. 사용자가 참여한 방 목록이나 내 방 화면은 제공하지 않습니다.
  • 방 생성 시 활성 질문 12개를 카테고리별 3개씩 고른 뒤 전체 12개의 순서를 무작위로 확정합니다.
  • 한 방의 모든 참여자는 동일한 질문 세트와 동일한 순서로 답변합니다.
  • 방 상태는 HOST_ANSWERING, OPEN으로 구분합니다.
  • 방 상태는 저장된 별도 값이 아니라 생성자의 제출 여부에서 파생되어 사용자에게 보이는 상태입니다.
  • 생성자가 답변을 제출해야 OPEN으로 전환되고 초대 링크를 공유할 수 있습니다.
  • 방 생성자는 그 방에서 유일한 방장으로 보입니다. 초대 링크로 참여한 사용자는 방장으로 표시되지 않습니다.
  • 방 참여 인원에 제품상 상한을 두지 않습니다. 결과 요약과 내 Pair 페이지는 고정된 항목 상한을 지키며, MVP 성능 보장은 완료 참여자 100명까지로 제한합니다.
  • 답변 완료자가 2명 이상이면 결과를 볼 수 있습니다.
  • 방에는 유효기간을 두지 않습니다. MVP에서는 방을 만료시키거나 삭제하는 기능을 제공하지 않습니다.

참여자

  • 회원가입 없이 닉네임으로 참여합니다.
  • 닉네임은 방 안에서 중복될 수 없습니다.
  • 닉네임은 1~12자의 화면에 표시 가능한 문자로 제한합니다.
  • 저장 시 앞뒤 공백을 제거하고 연속 공백을 1칸으로 줄입니다. 화면에 표시하는 값에도 적용합니다.
  • 중복 판정에는 위 처리에 더해 Unicode NFC 정규화, 남은 공백 전부 제거, 영문 대소문자 통합을 적용한 값을 사용합니다. 지 은지은은 같은 닉네임입니다.
  • 공백 제거는 중복 판정에만 적용합니다. 화면에 표시하는 값에서는 내부 공백을 그대로 둡니다. 지 은으로 입력한 사람은 지 은으로 보입니다.
  • 중복 판정에서 accent는 구분합니다. cafecafé는 다른 닉네임입니다.
  • 제어 문자와 마크업은 허용하지 않으며, 저장·출력 시 안전하게 처리합니다.
  • 닉네임 입력이 완료되면 서버가 추측하기 어려운 참여자 자격을 발급합니다.
  • 브라우저는 여러 방의 참여자 자격을 방별로 구분해 보존합니다. 방 A의 링크를 열면 방 A에 매핑된 자격만 사용하며, 다른 방의 자격을 대신 사용하지 않습니다.
  • 여러 방의 자격은 브라우저를 종료했다 다시 열어도 유지되며, 사용자가 해당 서비스의 브라우저 사이트 데이터를 삭제하면 모두 사라집니다.
  • 참여 자격이 보존되어도 참여한 방 목록은 제공하지 않습니다. 사용자가 방으로 돌아오는 유일한 경로는 해당 방의 공유 링크입니다.
  • 제출 전 선택한 임시 답변은 방 코드 기준 브라우저 저장소에 보관하여 뒤로 가기와 새로고침에서 복구합니다.
  • 기존 참여자 식별은 현재 방에 매핑된 참여자 자격만으로 판단하며, 브라우저 임시 답변은 제출 전 질문 진행 상태 복구에만 사용합니다.
  • 현재 방의 참여자 자격이 있고 임시 답변이 없으면, 미제출 참여자는 같은 참여자로 1번 질문부터 다시 답하고 제출 완료자는 결과 또는 대기 화면으로 이동합니다.
  • 현재 방의 참여자 자격이 없으면 브라우저 임시 답변이 남아 있어도 기존 참여자로 인증하거나 제출할 수 없습니다.
  • 이미 답변을 제출한 참여자는 MVP에서 답변을 수정할 수 없습니다.
  • 현재 링크의 방에 매핑된 참여자 자격이 없으면 새 참여자 흐름을 보여 줍니다. 그 방에서 이미 사용된 닉네임은 되찾을 수 없으며 다른 닉네임을 선택해야 합니다.
  • 방 A의 자격은 방 B의 참여자 상태, 답변, 제출 상태 또는 개인 Pair 결과를 조회하거나 변경할 수 없습니다. 잘못된 방 자격이 제시되어도 어느 방의 자격이나 데이터도 손상되지 않습니다.

결과 접근

  • 참여자는 자신의 답변 제출을 완료한 뒤 결과를 볼 수 있습니다.
  • 공유 링크로 들어온 방에서 답변을 제출한 참여자는 답변 완료자가 2명이면 Pair 결과를, 3명 이상이면 그룹 순위를 기존 공개 규칙에 따라 볼 수 있습니다. 제공하지 않는 것은 방을 가로지르는 내가 참여한 방 목록이지, 현재 방의 결과와 순위가 아닙니다.
  • 결과 화면은 점수와 요약 중심으로 제공합니다.
  • MVP에서는 별도의 공개 결과 페이지나 결과 전용 공유 링크를 만들지 않습니다.
  • 공유 메시지에는 현재 보고 있는 Pair 또는 그룹 TOP 1의 점수 요약과 초대 링크를 포함합니다.
  • 초대 링크를 연 미참여자는 참여 화면만 볼 수 있고, 12개 답변을 제출하기 전에는 전체 결과를 볼 수 없습니다.
  • 공유 메시지와 결과 화면에는 점수, 순위, 요약 문구를 제공합니다.

8. 질문 정책

MVP 질문 구성

MVP는 정확히 12개의 2지선다 질문으로 구성합니다.

카테고리:

  • 대화: 3문제
  • 여행: 3문제
  • 생활: 3문제
  • 소비: 3문제

질문 예시

카테고리 질문 예시 선택지 A 선택지 B
대화 연락 스타일은? 전화 카톡
대화 갈등이 생기면? 바로 대화 시간을 두기
대화 대화 분위기는? 깊은 대화 가벼운 농담
여행 여행 스타일은? 계획 여행 즉흥 여행
여행 쉬는 날은? 집에서 쉬기 밖에서 놀기
여행 숙소 선택은? 가성비 분위기
생활 생활 패턴은? 아침형 야행성
생활 정리 스타일은? 바로 정리 몰아서 정리
생활 약속 준비는? 미리 준비 직전 준비
소비 돈 사용은? 돈 모으기 경험에 쓰기
소비 선물 취향은? 실용적인 선물 의미 있는 선물
소비 선택 기준은? 연봉 워라밸

이미 만들어진 방의 질문과 결과는 바뀌지 않습니다. 이를 위해 등록된 질문의 문구와 선택지, 카테고리는 수정하지 않습니다. 문구를 바꾸려면 새 질문을 등록하고 기존 질문을 비활성화합니다. 방은 질문을 복사하지 않고 참조하지만, 질문이 바뀌지 않으므로 방 생성 시점의 내용이 그대로 유지됩니다.

방 생성 시 각 카테고리의 활성 질문 Pool에서 중복 없이 3개씩 추출합니다. 카테고리별 활성 질문이 3개 미만이면 방 생성을 중단하고 운영 오류로 기록합니다. 실패한 방 생성은 빈 방이나 생성자 닉네임 점유를 남기지 않습니다. 질문 Pool을 보완한 뒤 같은 닉네임으로 다시 시도할 수 있습니다.

9. 답변 제출 및 결과 공개 규칙

  • 모든 질문은 필수 답변입니다.
  • 참여자는 12개 질문에 모두 답해야 제출할 수 있습니다.
  • 제출 전에는 이전 질문으로 돌아가 선택을 바꿀 수 있습니다.
  • 제출 후에는 답변을 수정할 수 없습니다.
  • 동일 제출은 배열 순서와 무관하게 같은 12개 방 질문-선택 집합을 뜻합니다. 동일 제출이 중복 전송되면 하나의 완전한 제출 상태로 수렴하고 각 요청은 의미상 같은 성공 결과를 받습니다. 응답 생성 시각이나 추적 정보까지 바이트 단위로 같을 필요는 없습니다.
  • 이미 제출된 참여자가 다른 답변으로 다시 제출하면 요청을 거절합니다.
  • 누락 질문, 중복 질문, 현재 방에 속하지 않은 질문 또는 허용되지 않은 선택이 하나라도 포함되면 전체 제출을 거절합니다. 일부 답변도 남기지 않으며 참여자는 미제출 상태를 유지합니다.
  • 제출되지 않은 참여자에게 동일한 제출 두 건이 동시에 도착하면 두 요청 모두 의미상 성공하고 하나의 완전한 제출만 남습니다.
  • 서로 다른 제출 두 건이 동시에 도착하면 완전한 한 집합만 성공하고 다른 요청은 이미 다른 답변으로 제출 완료되었다는 결과로 거절됩니다. 두 요청의 답변이 섞인 부분 제출은 허용하지 않습니다.
  • 답변 완료자가 1명뿐이면 대기 화면을 보여 줍니다.
  • 답변 완료자가 2명 이상이면 결과 화면을 제공합니다.
  • 새로운 참여자가 답변을 완료하면 기존 완료자들과의 Pair 결과를 추가 계산하고 순위를 갱신합니다.
  • 대기 화면에서는 현재 참여자의 닉네임과 답변 중 또는 제출 완료 상태를 확인할 수 있습니다.

10. 점수 계산

전체 케미

전체 케미 점수 = (두 참여자의 일치 답변 수 / 12) x 100

소수점은 반올림하여 정수 점수로 표시합니다.

예시:

12문제 중 10문제 일치 → 83점
12문제 중 6문제 일치 → 50점

카테고리 케미

카테고리 케미 점수 = (해당 카테고리의 일치 답변 수 / 3) x 100

예시:

대화 3문제 중 3문제 일치 → 100점
여행 3문제 중 2문제 일치 → 67점
생활 3문제 중 1문제 일치 → 33점
소비 3문제 중 0문제 일치 → 0점

순위 계산

  • 전체 케미 순위는 전체 케미 점수 내림차순으로 정렬합니다.
  • 점수가 같으면 공동 순위로 표시합니다.
  • 공동 순위는 competition ranking을 사용합니다. 예를 들어 점수 [100, 100, 83, 67]의 순위는 [1, 1, 3, 4]입니다.
  • Pair 내부의 참여자 A와 B는 정규화된 닉네임 오름차순으로 고정합니다.
  • 공동 순위 내부는 정규화된 참여자 A 닉네임, 참여자 B 닉네임 순으로 안정적으로 정렬합니다. 이 정렬은 표시 순서만 결정하며 공동 순위를 나누지 않습니다.
  • 카테고리별 순위도 같은 방식으로 계산합니다. 그룹 요약에는 각 카테고리 대표 Pair 1개와 공동 1위 Pair 수만 제공합니다.

반전 케미 조합

그룹 결과에서는 세 번째 노출 Pair의 전체 점수보다 전체 점수가 엄격히 낮은 Pair 중 특정 카테고리 점수가 100점이고 전체 케미 점수보다 20점 이상 높은 Pair를 반전 케미 조합 후보로 봅니다. TOP 3 컷오프와 동점이지만 안정 정렬에서 잘린 Pair는 반전 후보가 아닙니다. 전체 Pair가 3개 이하이면 노출 컷오프 아래 Pair가 없으므로 반전 조합을 표시하지 않습니다. 후보가 여러 개면 카테고리 점수와 전체 점수의 차이가 가장 큰 Pair 1개만 노출하고, 차이도 같으면 순위의 안정 정렬 규칙을 적용합니다. 후보가 없으면 해당 콘텐츠를 표시하지 않습니다.

전체 케미 58점, 여행 케미 100점 → 여행에서 발견한 반전 케미 조합

11. 결과 콘텐츠 및 공유

2인 결과

  • 대표 문구: 사용자 A x 사용자 B, 전체 케미 83점
  • 전체 점수
  • 카테고리별 점수
  • 가장 잘 맞는 카테고리
  • 가장 다른 카테고리
  • 같은 선택 수
  • 결과 해석 문구
  • 공유 버튼
  • 새 케미방 만들기 버튼

최고점 또는 최저점 카테고리가 여러 개면 해당 카테고리를 모두 보여 줍니다. 네 카테고리가 모두 같은 점수이면 특정 최고/최저 카테고리가 없다고 안내합니다.

그룹 결과

  • 참여자 수
  • 전체 케미 TOP Pair 최대 3개
  • 카테고리별 대표 Pair 최대 4개와 각 공동 1위 Pair 수
  • 반전 케미 Pair 최대 1개
  • 내 Pair 결과 우선 노출
  • 내 Pair 목록은 기본 접힘 상태로 제공하며 점수순으로 페이지당 최대 10개씩 더 보기
  • 모든 Pair를 한 번에 내려주지 않습니다. Pair 수와 응답 크기는 참여자 수의 제곱에 비례해 증가하므로 전체 목록을 한 번에 반환하지 않습니다.
  • 새 참여자 유도 문구
  • 공유 버튼
  • 새 케미방 만들기 버튼

공유 방식

  • 모바일 브라우저가 Web Share API를 지원하면 네이티브 공유 시트를 호출합니다.
  • Web Share API를 지원하지 않으면 링크 복사 버튼을 제공합니다.
  • 공유 문구에는 현재 Pair 또는 그룹 TOP 1의 점수 요약과 참여 유도 링크를 포함합니다.
  • 그룹 TOP 1이 공동 1위이면 안정 정렬의 첫 Pair를 공유용 대표로 사용하고 공동 1위임을 함께 알립니다. 대표 선택은 다른 공동 1위 Pair의 순위를 낮추지 않으며 반복 조회에서도 같습니다.
  • 이미지 생성 공유는 MVP에서 제외하고, 텍스트와 링크 공유를 우선합니다.

12. 예외 및 상태 처리

잘못된 링크

  • 존재하지 않는 공유 코드면 잘못된 링크 화면을 보여 줍니다.
  • 사용자는 새 케미방 만들기로 이동할 수 있습니다.

닉네임 중복

  • 같은 방에 이미 존재하는 닉네임이면 다른 닉네임 입력을 요청합니다.
  • Unicode NFC, 공백 전부 제거, 영문 대소문자 통합 후 동일하면 중복으로 판단합니다. 앞뒤 공백과 연속 공백은 표시값 단계에서 이미 정리되고, 중복 판정은 거기서 남은 내부 공백까지 지웁니다.

재접속

  • 방은 공유 링크로만 다시 찾을 수 있으며, 서비스는 참여한 방 목록을 보여주지 않습니다.
  • 공유 링크를 열면 현재 방에 별도로 매핑된 참여자 자격만 확인합니다.
  • 방별 자격은 여러 방에 동시에 유지되고 브라우저 재시작 뒤에도 남습니다. 브라우저 사이트 데이터를 삭제하면 자격을 잃습니다.
  • 현재 방의 참여자 자격이 남아 있는 같은 브라우저에서는 기존 참여자로 식별합니다.
  • 현재 방의 참여자 자격과 브라우저 임시 답변이 모두 남아 있으면 진행 중이던 질문부터 복구합니다.
  • 현재 방의 참여자 자격은 있지만 임시 답변이 없으면 미제출 참여자는 1번 질문부터 다시 시작합니다.
  • 이미 제출한 사용자가 재접속하면 결과 또는 대기 화면으로 이동합니다.
  • 현재 방의 자격이 없으면 새 참여자 화면을 보여 줍니다. 자격을 잃은 사용자는 이미 사용된 기존 닉네임을 되찾을 수 없으며, 다른 닉네임으로 새로 참여해야 합니다.
  • 답변을 제출한 기존 참여자는 링크로 방에 돌아왔을 때 답변 완료자가 2명이면 Pair 결과를, 3명 이상이면 그룹 순위를 계속 볼 수 있습니다.

네트워크 오류와 중복 조작

  • 방 생성 또는 답변 제출 중 네트워크 오류가 발생하면 입력 상태를 유지하고 재시도 CTA를 제공합니다.
  • 처리 중에는 CTA를 비활성화하여 연속 탭을 막습니다.
  • 동일 답변 제출의 재시도는 멱등하게 처리합니다.

로딩 및 빈 상태

  • 방 정보를 불러오는 동안 로딩 상태를 제공합니다.
  • 아직 다른 참여자가 없으면 초대 대기 상태를 제공합니다.
  • 답변 완료자가 2명 미만이면 결과 대신 대기 상태를 제공합니다.

13. 기능 요구사항

ID 요구사항 우선순위
FR-01 사용자는 닉네임을 입력해 케미방을 생성할 수 있습니다. MVP
FR-02 방 생성 시 12개 질문이 4개 카테고리에서 각 3개씩 선택됩니다. MVP
FR-03 방의 질문 세트와 순서는 모든 참여자에게 동일하게 유지됩니다. MVP
FR-04 생성자가 답변을 제출해 방이 OPEN이 되면 초대 링크를 공유할 수 있습니다. MVP
FR-05 사용자는 12개 질문에 모두 답한 뒤 제출할 수 있습니다. MVP
FR-06 제출된 답변은 MVP에서 수정할 수 없습니다. MVP
FR-07 답변 완료자가 2명 이상이면 Pair 결과를 계산합니다. MVP
FR-08 3명 이상이면 모든 Pair를 계산해 그룹 순위를 제공합니다. MVP
FR-09 전체 점수와 카테고리별 점수를 표시합니다. MVP
FR-10 동점 Pair는 공동 순위로 표시합니다. MVP
FR-11 Web Share API와 링크 복사 fallback을 제공합니다. MVP
FR-12 잘못된 링크와 닉네임 중복 상태를 처리합니다. MVP
FR-13 답변 중인 참여자는 같은 브라우저에서 진행 상태를 복구할 수 있습니다. MVP
FR-14 현재 참여자와 답변 상태를 확인할 수 있습니다. MVP
FR-15 오늘의 관계 타로를 제공합니다. 추후
FR-16 관계별 케미 기록을 제공합니다. 추후
FR-17 카드 컬렉션을 제공합니다. 추후

14. 수용 기준

방과 질문

ID Given / When / Then
AC-ROOM-01 방 생성에 성공하면 생성자는 그 방의 유일한 방장으로 보이고, 링크로 들어온 참여자는 방장으로 표시되지 않습니다.
AC-ROOM-02 방 생성에 성공하면 활성 질문 12개가 카테고리별 3개씩 포함되고, 방마다 전체 12개의 순서가 무작위로 정해지며, 그 방의 모든 참여자는 한 번 정해진 같은 순서를 봅니다.
AC-ROOM-03 어느 카테고리든 활성 질문이 2개뿐이면 방 생성은 운영 오류로 실패하고 빈 방이나 닉네임 점유를 남기지 않으므로, Pool 보완 후 같은 닉네임으로 다시 생성할 수 있습니다.
AC-ROOM-04 질문 문구를 교체할 때 새 질문을 등록하고 기존 질문을 비활성화하면, 교체 전에 시작한 방은 종전 질문을 같은 순서로 계속 보여주고 이후 생성된 방만 새 질문을 받을 수 있습니다.
AC-FLOW-01 생성자가 제출하기 전에는 방이 HOST_ANSWERING으로 보이고 초대 CTA가 노출되지 않으며, 12개 답변 제출이 완료되면 파생 상태가 OPEN으로 보이고 초대 CTA가 노출됩니다.
AC-FLOW-02 답변 완료자가 1명이면 대기 화면을 보여주고, 2명이면 1개 Pair 결과를, N명이면 조회 시 계산한 N(N-1)/2개 Pair를 기준으로 제한된 결과 요약과 내 Pair 페이지를 제공합니다.
AC-FLOW-03 참여 현황을 조회하면 현재 방 참여자의 닉네임과 답변 중 또는 제출 완료 파생 상태가 보이고, 새 참여나 제출 완료 후 다시 조회하면 현재 상태가 반영됩니다.

제출과 원자성

ID Given / When / Then
AC-SUBMIT-01 다른 방 질문, 누락 질문, 중복 질문 또는 잘못된 선택이 하나라도 포함된 제출은 전체가 거절되고, 답변 일부가 남지 않으며 사용자는 미제출 상태로 보입니다.
AC-SUBMIT-02 같은 12개 방 질문-선택 집합을 다른 배열 순서로 재전송하면 같은 제출 완료 상태와 결과 의미로 성공 수렴합니다. 응답 생성 시각이나 추적 정보의 바이트 동일성은 요구하지 않습니다.
AC-SUBMIT-03 미제출 참여자에게 동일 제출 두 건이 동시에 도착하면 두 요청 모두 의미상 성공하고, 사용자는 하나의 완전한 제출 결과를 가진 제출 완료자로 보입니다.
AC-SUBMIT-04 서로 다른 제출 두 건이 동시에 도착하면 완전한 한 답변 집합만 성공하고 다른 요청은 이미 다른 답변으로 제출 완료되었다는 결과로 거절되며, 두 집합이 섞인 부분 상태는 남지 않습니다.
AC-SUBMIT-05 이미 제출한 참여자가 순차적으로 다른 답변 집합을 보내면 거절되고 최초의 완전한 답변과 결과가 유지됩니다.

순위, 동점과 공유

ID Given / When / Then
AC-RANK-01 완료자 N명의 모든 Pair가 같은 점수여도 그룹 TOP 요약에는 안정 정렬의 앞선 Pair가 최대 3개만 보이고, 셋 모두 같은 공동 순위로 표시되며 반복 조회의 순서가 같습니다.
AC-RANK-02 Pair 점수가 [100, 100, 83, 67]이면 competition ranking에 따라 순위가 [1, 1, 3, 4]로 표시됩니다.
AC-RANK-03 TOP 3 컷오프 점수와 동점이라 요약에서 잘린 Pair는 반전 케미로 표시되지 않으며, 반전 케미는 세 번째 노출 Pair보다 전체 점수가 엄격히 낮은 후보에서만 최대 1개 선택됩니다.
AC-RANK-04 공동 TOP 1이 여러 Pair이면 공유 문구는 반복 조회마다 안정 정렬의 같은 대표 Pair를 사용하고 공동 1위임을 알리며 다른 공동 1위의 순위를 낮추지 않습니다.
AC-RANK-05 한 Pair의 최고점 또는 최저점 카테고리가 둘 이상이면 해당 카테고리를 모두 보여 주고, 네 카테고리가 모두 같은 점수이면 특정 최고/최저 없음으로 보여 줍니다.
AC-RANK-06 한 카테고리의 1위 Pair가 여러 개이면 그 공동 리더 안에서 정규화된 A 닉네임, B 닉네임 오름차순의 첫 Pair와 공동 1위 Pair 수를 보여 줍니다. 다른 공동 리더의 전체 케미가 더 높아도 대표는 바뀌지 않습니다.

링크, 재접속과 방 간 격리

ID Given / When / Then
AC-TOKEN-SCOPE 한 브라우저에서 방 A에 참여하고 방 B에 참여한 뒤 각 공유 링크로 A와 B를 다시 열면, 각 방에 별도로 매핑된 기존 참여자 자격으로 복귀합니다. 서비스는 참여한 방 목록을 제공하지 않습니다.
AC-TOKEN-RESTART 브라우저를 종료했다 다시 열어도 공유 링크를 통해 기존 참여자로 복귀하며, 해당 서비스의 브라우저 사이트 데이터를 삭제한 뒤에는 새 참여자 흐름을 보여 줍니다.
AC-TOKEN-MISSING 링크는 유효하지만 현재 방의 자격이 없으면 새 참여자 흐름을 보여주고, 이미 사용된 닉네임은 되찾을 수 없으므로 다른 닉네임을 요청합니다.
AC-TOKEN-RESULT 공유 링크로 들어온 참여자가 답변을 제출하면 완료자가 2명일 때 현재 방의 Pair 결과를, 3명 이상일 때 그룹 순위를 볼 수 있습니다. 내 방 목록 부재는 현재 방의 결과 공개를 막지 않습니다.
AC-TOKEN-PROGRESS 유효한 현재 방 자격과 임시 답변이 함께 남아 있으면 마지막으로 보던 질문과 선택을 복구하고, 자격만 남아 있으면 같은 참여자로 1번 질문부터 다시 시작합니다.
AC-SEC-ROOM-ISOLATION 방 A의 자격으로 방 B의 비공개 참여자 상태, 답변, 제출 상태 또는 개인 Pair 결과를 읽거나 변경하려 하면 거절되고, 어느 방의 자격이나 데이터 상태도 손상되지 않습니다.

화면과 오류

ID Given / When / Then
AC-UI-01 360px 폭에서 생성, 답변, 결과 확인 중 가로 스크롤이 없고 모든 주요 CTA의 터치 영역이 최소 44×44 CSS pixel입니다.
AC-UI-02 Web Share API 지원 환경에서는 네이티브 공유를 사용하고, 미지원 환경에서는 링크 복사를 완료할 수 있습니다.
AC-UI-03 초대 링크로 들어온 미제출 사용자는 결과를 볼 수 없고, 존재하지 않는 공유 코드에는 잘못된 링크 화면과 새 방 만들기 이동 수단을 제공합니다.
AC-UI-04 결과 화면은 낮은 점수가 관계의 좋고 나쁨을 뜻하지 않는다는 안내를 포함합니다.

접근성 상세 검증은 MVP-UI-A11Y-v1으로 수행합니다. 360px/375px, iOS Safari 최신 2개 주요 버전과 VoiceOver, Android Chrome 최신 2개 주요 버전과 TalkBack, 데스크톱 키보드 전용 탐색을 포함합니다. 가로 overflow와 44×44 CSS pixel hit-area는 자동 검사하고, 레이블·초점 순서·상태 읽기는 스크린리더 수동 시나리오로 확인합니다. Web Share 지원/미지원은 capability stub으로 각각 검증합니다. 구체 도구는 후속 UI 이슈에서 정합니다.

FR → AC 추적표

FR 연결 수용 기준
FR-01 AC-ROOM-01, AC-ROOM-03
FR-02 AC-ROOM-02, AC-ROOM-03
FR-03 AC-ROOM-02, AC-ROOM-04
FR-04 AC-FLOW-01
FR-05 AC-SUBMIT-01~04
FR-06 AC-SUBMIT-02~05
FR-07 AC-FLOW-02, AC-TOKEN-RESULT
FR-08 AC-FLOW-02, AC-RANK-0106, NFR-PERF-0104
FR-09 AC-RANK-04~06, AC-UI-04
FR-10 AC-RANK-01~02
FR-11 AC-RANK-04, AC-UI-02
FR-12 AC-ROOM-03, AC-TOKEN-MISSING, AC-UI-03
FR-13 AC-TOKEN-SCOPE, AC-TOKEN-RESTART, AC-TOKEN-PROGRESS, AC-SEC-ROOM-ISOLATION
FR-14 AC-FLOW-03

15. MVP 범위

포함

  • 모바일 웹 우선 UI
  • 닉네임 기반 참여
  • 케미방 생성
  • 공유 링크
  • 방 단위 고정 질문 12개
  • 답변 저장
  • 2인 Pair 케미 계산
  • 다인 Pair 케미 계산
  • 그룹 케미 순위
  • 카테고리별 결과
  • 결과 공유
  • 주요 예외 상태 처리

제외

  • 회원가입
  • 결제
  • LLM 또는 AI 분석
  • 실시간 채팅
  • 사용자 친구 목록
  • 사용자가 참여한 방 목록 또는 내 방 화면
  • 사용자 직접 질문 등록
  • 장기 프로필 관리
  • 장기 케미 기록
  • 순위 변화 히스토리
  • 그룹 결과의 가장 다른 조합 (6.2 목록에 있으나 MVP 화면에 넣지 않습니다. 제외 이유는 6.2 참고)
  • 2인 결과의 다른 선택 수 (6.1 목록에 있으나 MVP 화면에 넣지 않습니다)
  • 이미지 기반 결과 공유
  • 푸시 알림
  • 지표 수집을 위한 이벤트 로깅

16. 개인정보 및 데이터 보존

수집 데이터

  • 방 공유 코드
  • 닉네임
  • 질문 세트
  • 선택 답변
  • 방 생성 시각, 참여자 생성 시각, 답변 제출 시각
  • 방별 재접속을 위한 브라우저 참여자 자격

Pair 점수와 순위는 저장된 답변으로부터 조회 시 계산하는 파생 데이터이며 MVP에서는 별도 영구 저장하지 않습니다.

개인정보 원칙

  • MVP에서는 이메일, 전화번호, 소셜 계정 정보를 수집하지 않습니다.
  • 닉네임은 사용자가 자유롭게 입력하므로 개인정보를 입력하지 않도록 안내합니다.
  • 답변 데이터는 재미용 결과 계산을 위해서만 사용합니다.
  • 링크를 가진 사용자가 방에 접근할 수 있으므로 공유 코드의 예측 가능성을 낮춥니다.

보존 정책

  • MVP에서는 방과 답변 데이터를 기한 없이 보관합니다. 자동 만료와 물리 삭제는 제공하지 않습니다.
  • 방과 답변의 보존 기간은 브라우저의 재접속 자격 수명과 별개입니다. 브라우저 사이트 데이터 삭제로 자격을 잃어도 방과 답변은 보존되며, 계정이나 별도 복구 수단이 없으므로 기존 참여자 권한을 되찾을 수 없습니다.
  • 저장하는 정보는 사용자가 임의로 입력한 닉네임과 2지선다 선택값뿐이며 민감 정보를 포함하지 않습니다.
  • 데이터 정리 정책은 실사용 규모를 확인한 뒤 도입합니다.

장기 기록 관련 주의

케미 기록 기능은 "같은 사람과 다시 테스트한 결과"를 연결해야 합니다. MVP의 비회원 구조에서는 사용자를 장기적으로 안정 식별할 수 없으므로, 장기 케미 기록을 제공하려면 향후 식별 전략이 필요합니다.

가능한 식별 전략:

  • 선택형 회원가입
  • 기기 기반 임시 식별
  • 관계 링크 기반 재테스트
  • 사용자가 직접 저장하는 결과 코드

17. 비기능 요구사항

성능

  • 운영 환경의 모바일 p75 기준 LCP 2.5초 이하를 목표로 합니다.
  • 질문 선택 후 다음 질문 전환은 로컬 UI 기준 100ms 이내 반응을 목표로 합니다.
  • 제품은 100명을 넘는 방도 기능적으로 거절하지 않습니다. 다만 별도 측정 전에는 아래 MVP-PERF-v1의 p95 목표 보장 범위 밖입니다.

MVP-PERF-v1 기준선

완료 참여자 수 생성 Pair 수 결과 조회 동시 요청 측정 구간 합격 기준
2 1 1 워밍업 후 5분 서버 처리 p95 ≤ 500ms
10 45 10 워밍업 후 5분 서버 처리 p95 ≤ 500ms
50 1,225 20 워밍업 후 5분 서버 처리 p95 ≤ 500ms
100 4,950 20 워밍업 후 5분 서버 처리 p95 ≤ 500ms
  • NFR-PERF-01: 참조 런타임은 Java 21, Spring Boot 4.1.1, MySQL 8.4입니다. 애플리케이션은 2 vCPU, RAM 2GiB, JVM 최대 힙 1GiB를 사용하고 MySQL은 2 vCPU, RAM 4GiB, InnoDB buffer pool 1GiB를 사용합니다. 둘은 같은 리전의 전용 테스트 네트워크에 배치합니다.
  • NFR-PERF-02: 각 행은 완료 참여자 수를 가진 단일 방과 참여자별 유효 답변 12개로 측정합니다. 표의 동시 요청 수만큼 가상 사용자가 유효한 참여자 자격으로 결과 조회를 반복하고, 각 응답 뒤 250ms 대기하는 closed workload를 사용합니다. 2분 워밍업 후 5분을 측정합니다.
  • NFR-PERF-03: 서버 처리 시간은 요청 수신부터 응답 직렬화 완료까지이며 외부 인터넷 왕복 시간을 제외합니다. 각 행에서 p95는 500ms 이하, 유효 요청 오류율은 0.1% 이하, 5xx는 0건이어야 합니다. 의도적으로 발생시킨 4xx는 측정에서 제외합니다.
  • NFR-PERF-04: 결과 요약은 TOP Pair 최대 3개, 카테고리 대표 최대 4개, 반전 Pair 최대 1개, 내 Pair 첫 페이지 최대 10개를 지킵니다. HTTP 압축 적용 전 UTF-8 JSON 응답 본문은 64KiB를 넘지 않습니다.
  • 참조 환경의 런타임, 자원, 배치, 데이터 또는 부하 모델이 바뀌면 새 프로필 버전을 부여합니다. 측정 결과에는 프로필 버전을 기록하며 서로 다른 버전의 수치를 같은 기준선으로 직접 비교하지 않습니다.

안정성

  • 답변 제출은 중복 요청에도 한 번만 반영되어야 합니다.
  • 새로고침이나 브라우저 뒤로 가기에서 사용자가 비정상 상태에 빠지지 않아야 합니다.
  • 질문 세트가 생성된 뒤에는 기존 방의 질문이 바뀌지 않아야 합니다.

접근성

  • 버튼과 입력 필드는 명확한 레이블을 가집니다.
  • 키보드 조작으로 주요 흐름을 완료할 수 있어야 합니다.
  • 점수와 상태는 색상 외 텍스트로도 전달합니다.

보안

  • 공유 코드는 추측하기 어렵게 생성합니다.
  • 공유 코드는 최소 128-bit entropy를 가진 비순차 URL-safe 난수로 생성합니다.
  • 사용자 입력값은 저장 및 출력 시 안전하게 처리합니다.
  • 관리자용 데이터 조회 기능은 MVP 사용자 화면에 노출하지 않습니다.
  • 참여자 자격은 방별로 격리하며, 현재 요청한 방에 매핑된 자격만 그 방의 비공개 참여자 데이터와 개인 결과에 사용할 수 있습니다.

호환성

  • iOS Safari와 Android Chrome의 최신 2개 주요 버전을 우선 지원합니다.
  • Web Share API, 쿠키 또는 브라우저 저장소를 사용할 수 없는 환경에서는 가능한 기능과 제한 사항을 사용자에게 안내합니다.

18. 성공 지표

MVP에서는 방, 참여자, 답변 데이터로 산출할 수 있는 지표만 측정합니다. 클릭률, 조회율, 재방문율처럼 이벤트 로깅이 필요한 지표는 목표 정의로만 두고, 이벤트 로깅을 도입한 뒤에 측정합니다 (15장 참고).

MVP 핵심 지표

  • 생성된 케미방 수
  • 방당 평균 참여자 수
  • 방 생성 후 첫 추가 참여까지 걸린 시간
  • 답변 시작 대비 제출 완료율
  • 결과 공유 클릭률
  • 공유 링크를 통한 신규 참여율
  • 3명 이상 참여한 방 비율
  • 새 케미방 생성 전환율

제품 해석 지표

  • 평균 Pair 수
  • 그룹 결과 조회율
  • 카테고리 결과 조회율
  • 재방문율

19. 기술 구성

Backend

  • Java 21
  • Spring Boot
  • Spring MVC
  • Spring Data JPA
  • MySQL

초기에는 WebFlux, Redis, 메시지 브로커 없이 동기식 MVC 구조로 구현합니다.

HTTP Request
  ↓
Controller
  ↓
Service
  ↓
Repository
  ↓
MySQL

Frontend

  • Next.js
  • TypeScript
  • App Router
  • 모바일 웹 우선 반응형 UI

Database

  • MySQL
  • 초기 스키마와 seed 데이터는 database/ 하위에서 관리합니다.

디렉토리 구조

root/
├── backend/
│   └── Spring Boot + Java 21
├── frontend/
│   └── Next.js + TypeScript
└── database/
    ├── docker-compose.yml
    ├── init/
    │   ├── 01-schema.sql
    │   └── 02-seed.sql
    └── README.md

백엔드 패키지 방향

backend/
├── room/
├── participant/
├── question/
├── answer/
├── chemistry/
├── result/
└── common/

20. 주요 데이터 모델

Room

  • 방 ID
  • 공유 코드
  • 생성 시각

생성자와 방 상태는 별도 컬럼으로 저장하지 않습니다. 생성자는 Participant가 생성자 여부를 가지고, 방 상태는 생성자의 제출 시각으로 정해집니다. 제출 시각이 있으면 OPEN이고 없으면 HOST_ANSWERING입니다. 사용자에게 제공하는 응답에는 이 파생 상태를 포함합니다.

RoomQuestion

  • 방 ID
  • 질문 ID

질문 문구와 선택지, 카테고리는 복사하지 않고 Question을 참조합니다. 표시 순서도 별도 컬럼을 두지 않으며 생성 순서를 따릅니다. 방을 만들 때 12개를 무작위로 섞어 넣으므로 방마다 순서가 다르고, 한 방 안에서는 모든 참여자가 같은 순서로 봅니다.

Participant

  • 참여자 ID
  • 방 ID
  • 닉네임
  • 재접속 토큰
  • 생성자 여부
  • 생성 시각
  • 제출 시각

답변 상태는 별도 컬럼으로 저장하지 않습니다. 제출 시각이 있으면 SUBMITTED이고 없으면 ANSWERING입니다. 사용자에게 제공하는 응답에는 이 파생 상태를 포함합니다.

Answer

  • 참여자 ID
  • 방 질문 ID
  • 선택값

PairResult 응답 모델

  • 방 ID
  • 참여자 A
  • 참여자 B
  • 전체 점수
  • 카테고리별 점수
  • 일치 수
  • 계산 시각

PairResult는 저장된 답변에서 조회 시 계산하는 파생 응답 모델입니다. MVP에서는 별도 테이블로 영구 저장하지 않습니다. 요청 시 점수와 순위를 다시 계산하되, 응답에는 내 Pair와 상위 순위만 담습니다.

21. 단계별 로드맵

1단계: MVP

  • 케미방 생성
  • 고정 12문제 답변
  • 2인 케미 결과
  • 그룹 Pair 결과
  • 그룹 순위
  • 결과 공유

2단계: 질문 콘텐츠 확장

  • 음식편
  • 여행편
  • 연애편
  • 직장인편
  • 커플편
  • 가족편
  • 랜덤 질문팩

3단계: 그룹 재미 강화

  • 새로운 1위 등장
  • TOP 3 신규 진입
  • 카테고리별 1위 변경
  • 특정 Pair 순위 상승
  • 재대결 유도

4단계: 케미 기록

  • 같은 사람과 다시 테스트한 결과 기록
  • 지난 결과와 현재 결과 비교
  • 관계 변화 문구 제공

예시:

8월 사용자 A x 사용자 B 83점
12월 사용자 A x 사용자 B 92점

우리 케미가 지난번보다 9점 올랐어요.

단, 이 단계는 비회원 식별 전략 확정 후 진행합니다.

5단계: 오늘의 관계 타로

케미 테스트 이후 재방문을 유도하는 부가 콘텐츠로 제공합니다.

오늘 우리 둘의 카드는?

THE SUN
오늘은 서로의 텐션이 잘 맞는 날.
키워드: 즐거움, 솔직함, 좋은 흐름

LLM은 사용하지 않고 사전에 준비된 카드 및 해석 데이터를 사용합니다.

6단계: 타로 및 컬렉션 확장

  • 메이저 아르카나 22장 기반 오늘의 1장 타로
  • 3장 타로: 나, 상대, 우리 관계
  • 발견한 카드 컬렉션
  • 관계별 타로 기록
  • 특별 카드 또는 뱃지

타로 콘텐츠는 실제 미래를 단정하는 목적이 아니라 재미용 콘텐츠로 제공합니다.

22. 바이럴 구조

A가 케미방 생성
  ↓
B에게 공유
  ↓
A x B 케미 생성
  ↓
C 참여
  ↓
A x C / B x C 케미 추가
  ↓
새로운 순위 생성
  ↓
D / E 추가 참여
  ↓
모임 케미 결과가 계속 변화

핵심은 새로운 참여자가 들어올 때마다 결과가 하나만 생기는 것이 아니라 기존 구성원들과의 새로운 관계가 함께 생성된다는 점입니다.

23. 미결정 사항

  • 데스크톱 UI의 최종 레이아웃
  • 질문 Pool 운영 방식과 관리자 등록 방식
  • 장기 케미 기록을 위한 식별 전략
  • 타로 카드 이미지 제작 방식과 저작권 정책
  • 베타 측정 이후 성능 목표를 조정할지 여부
  • 방 삭제 기능과 데이터 정리 정책의 도입 시점

24. 문서 정보

  • 문서 버전: v1.1
  • 상태: MVP 요구사항 검토 완료
  • 작성일: 2026-08-24
  • 최종 수정일: 2026-08-28

Clone this wiki locally