사례

궁합 테스트

결과물 새 탭 ↗
프로젝트 시작10월 8일 오전 04:25바로 개발 시작
개발 내용
두 사람의 궁합을 점수로 봐주는 재미 궁합 테스트 웹서비스를 만들어줘. 두 사람 이름(+선택: 생년월일·MBTI)과 관계 유형을 넣으면 0~100점 궁합 점수·등급·해설이 나오고, 그 결과를 친구에게 공유하게 만드는 게 목적이야. 아래 계산 규칙과 문구는 확정값이니 그대로 쓰고 바꾸지 마. [페이지] - / : 입력 — 제목 "우리 궁합 몇 점일까?", 부제 "이름만 넣어도 돼요 — 생년월일·MBTI를 더하면 더 정확해져요", 참여 카운터, 두 사람 입력, 관계 유형, [궁합 보기] - /result/{input_hash} : 결과 — 새로고침하거나 공유 링크로 들어와도 같은 결과 - /admin : 관리자 — 참여자 화면에는 관리자로 가는 링크·버튼을 두지 않는다(주소로만 들어감) [입력] - 두 사람(나 / 상대) 각각: 이름(필수, 10자 이내) · 생년월일(선택) · MBTI(선택 — 16개 중 고르기, "모름" 가능). - 관계 유형: 연인 / 썸 / 친구 중 하나(기본 연인). - 생년월일은 둘 다 넣었을 때만, MBTI는 둘 다 골랐을 때만 계산에 들어간다 — 한쪽만 넣었으면 "둘 다 넣어야 반영돼요"라고 알려줘. - 참여 카운터: "지금까지 {N}쌍이 궁합을 봤어요"(누적). 오늘 기록이 1건 이상이면 옆에 "오늘 {n}쌍". [계산 — 확정 규칙, 난수 금지] - 정리: 이름은 공백 제거. 한 사람 = "이름|생년월일(YYYY-MM-DD, 없으면 -)|MBTI(대문자, 없으면 -)". 두 사람 문자열을 정렬해 A·B로 정한다 — 순서를 바꿔 넣어도 같은 결과. - 키 = 정렬한 두 줄 + 관계 유형, h = SHA-256(키). input_hash = h 의 hex 앞 12자. - 성분 점수(각 0~100). 이름은 항상, 생년월일 성분 6종은 둘 다 생년월일이 있을 때만, MBTI는 둘 다 있을 때만. · 이름 궁합: 음절 획수 = 초성+중성+종성 자모 획수 합(자모 획수표는 하나 정해 고정, 한글이 아니면 문자코드 % 9 + 1). 각 음절 획수 % 10 을 A·B 음절 번갈아 늘어놓고(A1 B1 A2 B2 …, 남는 쪽은 뒤에 이어서) 이웃한 두 수의 합 % 10 으로 줄여 나가 두 자리가 남으면 그 두 자리 수(예: 7, 3 → 73). · 띠: 번호 = (출생연도 − 4) % 12 (0 쥐 … 11 돼지). 육합(0·1, 2·11, 3·10, 4·9, 5·8, 6·7) 95 / 삼합(8·0·4, 5·9·1, 2·6·10, 11·3·7 중 같은 무리의 서로 다른 두 띠) 88 / 같은 띠 78 / 번호 차 6 이면 38 / 그 외 55 + ((i+j) % 5) × 3. · 별자리: 양력 생일로 판정 — 양 3/21~, 황소 4/20~, 쌍둥이 5/21~, 게 6/22~, 사자 7/23~, 처녀 8/23~, 천칭 9/23~, 전갈 10/23~, 사수 11/23~, 염소 12/22~1/19, 물병 1/20~, 물고기 2/19~3/20. 원소는 양자리부터 불·흙·바람·물 반복. 같은 원소 82, 불+바람·흙+물 88, 바람+물 62, 불+흙 58, 바람+흙 48, 불+물 42. 같은 별자리면 −6. · 운명수: 생년월일 8자리 숫자를 한 자리가 될 때까지 더한 수 x, y. x+y=10 이면 90, 같으면 84, 차가 1 이면 55, 그 외 60 + ((x×y) % 7) × 3. · 감성·신체·지성 리듬: 두 생일 사이 일수 d 로 round(50 + 50×cos(2πd / 주기)) — 감성 28일, 신체 23일, 지성 33일. · MBTI: 50 + E/I(다르면 12, 같으면 2) + S/N(같으면 22, 다르면 −12) + T/F(다르면 10, 같으면 4) + J/P(다르면 8, 같으면 2), 최대 100. - 가중치(연인 / 썸 / 친구): 이름 .18/.14/.14 · 띠 .12/.08/.12 · 별자리 .13/.13/.08 · 운명수 .07/.05/.08 · 감성 .20/.15/.08 · 신체 .05/.20/.05 · 지성 .05/.05/.25 · MBTI .20/.20/.20. - raw = Σ(성분 × 가중치) / Σ(계산에 들어간 성분의 가중치). 흔들림 = (h 앞 8바이트를 부호 없는 정수로 읽은 값 % 11) − 5. 점수 = round(60 + (raw − 55) × 1.5 + 흔들림) 을 1~100 으로 자른다. - 단, 이름 궁합만 들어간 경우(생년월일·MBTI 없음)는 점수 = round(60 + (이름 궁합 − 50) × 0.7 + 흔들림) 을 1~100 으로 자른다 — 위 식을 그대로 쓰면 이름만 넣은 사람의 40% 가까이가 100점이나 10점 이하로 몰린다. - 등급과 한줄 해설: 91~100 천생연분 "이런 궁합은 놓치면 범죄예요" 81~90 환상의 케미 "같이 있으면 시간 가는 줄 모르는 사이" 66~80 좋은 궁합 "안정감 속에 설렘이 숨어 있는 조합" 51~65 노력형 궁합 "맞춰가는 재미가 있는 사이 — 노력이 답" 31~50 밀당 궁합 "당기고 밀리는 스릴… 지치지만 않는다면?" 1~30 극과 극 "정반대라서 오히려 끌릴 수도? (아닐 수도)" - 잘 맞는 점 = 성분 점수 상위 2개, 주의할 점 = 하위 2개(들어간 성분이 하나뿐이면 각 1개). 성분마다 아래 문구 2개 중 하나를 h 로 고른다(같은 입력이면 같은 문구). [성분별 문구] 잘 맞는 점 ① / ② · 주의할 점 ① / ② - 이름 궁합: 이름부터 운명처럼 얽혀 있어요 / 서로의 이름을 부를수록 가까워지는 사이 · 가끔 서로의 마음을 넘겨짚지 마세요 / 표현은 이름 부르기부터 — 자주 불러주세요 - 띠: 타고난 기운이 서로를 밀어줘요 / 어른들이 보면 고개를 끄덕일 조합 · 고집 대 고집이 되면 길어져요 / 양보 한 번이 큰 싸움을 막아요 - 별자리: 감성의 결이 같은 원소예요 / 말하지 않아도 통하는 분위기 · 감정 온도차가 날 때가 있어요 / 기분 상했을 땐 하루 묵히지 말기 - 운명수: 운명수가 서로를 채워주는 짝이에요 / 숫자로도 증명되는 인연 · 삶의 속도가 달라 답답할 수 있어요 / 서로의 페이스를 존중해 주세요 - 감성 리듬: 기분의 파도가 같이 움직여요 / 슬플 때 같이 슬퍼해줄 사람 · 기분이 엇갈리는 날엔 거리두기보다 대화 / 예민한 날을 서로 알려주세요 - 신체 리듬: 에너지 리듬이 딱 맞아요 / 같이 놀면 지치지 않는 조합 · 한쪽만 지치는 약속은 피하세요 / 쉬는 것도 같이 — 억지로 끌고 가지 말기 - 지성 리듬: 대화가 끊기지 않는 사이 / 취향 토론이 데이트가 되는 조합 · 관심사가 갈릴 땐 번갈아 맞춰주기 / 설명하려 들지 말고 들어주세요 - MBTI: 성격 퍼즐이 맞물리는 조합이에요 / 서로의 빈칸을 채워주는 성격 · 말투 차이를 성의 차이로 오해하지 마세요 / 계획파·즉흥파 싸움은 무승부예요 [결과 화면] - 두 이름을 하트로 잇고 관계 유형 표시. - 점수(크게) + 0~100 게이지, 등급 + 한줄 해설. - "전체 {N}쌍 중 상위 {p}%" — p = (이 점수보다 높은 결과 수 + 1) / 전체 × 100 을 올림. - 잘 맞는 점 · 주의할 점. - 성분별 점수 막대(계산에 들어간 성분만): 이름 궁합 · 띠 · 별자리 · 운명수 · 감성 리듬 · 신체 리듬 · 지성 리듬 · MBTI. - 맨 아래 작게 "재미로 보는 테스트예요". - 버튼: [공유하기](휴대폰은 기기 공유창, 안 되면 링크 복사) · [이미지로 저장](결과 카드를 PNG로 내려받기) · [우리도 해보기](첫 화면으로). 직접 계산하지 않고 공유 링크로 들어온 사람에겐 [우리도 해보기]를 가장 크게(내가 계산한 결과인지는 브라우저에 기억). - 없는 결과 주소면 "결과를 찾을 수 없어요" + [궁합 보러 가기]. [공유 미리보기 — 중요] - 배포된 공개 주소에서는 /api 로 시작하는 요청만 Go 서버가 받고, 나머지 경로는 빌드된 정적 파일이 응답한다(vite 개발 서버·플러그인은 배포본에 없다). 그래서 /result/… 에는 서버가 결과별 메타를 넣을 수 없다 — 개발 미리보기에서 되는 것처럼 보여도 배포 후엔 안 된다. - 그래서 공유 주소는 /api/s/{input_hash} 로 한다: Go 가 결과별 OG 메타를 채운 작은 HTML 을 응답하고, 사람은 스크립트(location.replace)로 바로 /result/{input_hash} 로 보낸다. meta refresh 는 쓰지 마(크롤러가 따라가면 결과별 메타를 놓친다). 스크립트가 안 돌 때를 위해 본문에 결과 보기 링크도 둔다. - og:title "{A} ♥ {B} 궁합 {점수}점", og:description "{등급} — {한줄 해설} 우리도 궁합 볼까?", og:url 은 이 공유 주소 자신, og:image 는 절대 주소의 대표 이미지(1200×630 PNG — 카톡은 SVG를 못 읽는다. 글자 없이 앱 색과 하트 모양으로, 서버 코드로 그려 만들어도 된다). - 메타 값은 HTML 이스케이프(Go html/template) — 해설 속 따옴표가 속성을 깨지 않게. - [공유하기]·링크 복사는 이 공유 주소를 쓴다. - index.html 의 <title>("우리 궁합 테스트")과 기본 OG(앱 이름·한 줄 소개·같은 대표 이미지)도 채운다. [관리자 /admin] - 데모 계정 admin / demo1234 를 시드하고 로그인 화면에 안내를 표시해. - 통계: 총 참여·오늘 참여, 최근 30일 일별 참여 막대, 점수 분포(10점 구간), 등급별 비율, 관계 유형별 평균 점수. - 문구 관리: 등급 6개의 한줄 해설과 성분별 문구를 고쳐 저장. 고친 문구는 기존 결과 화면에도 바로 반영. [기본 문구로 되돌리기] 버튼. [데이터] - results(input_hash UNIQUE, name_a, name_b, relation, score, grade, parts JSON — 성분별 점수, created_at). 생년월일·MBTI 원문은 저장하지 않는다. 같은 입력을 다시 넣으면 새로 기록하지 않고 기존 결과 주소로 보낸다. - copy_templates(kind: grade|strength|caution, key: 등급명 또는 성분명, position, text) — 위 문구로 시드. 해설 문구는 결과에 저장하지 않고 보여줄 때 여기서 고른다. - admins(username, password_hash) [시드] 카운터·통계가 0으로 보이지 않게 참여 기록 10쌍 안팎을 지난 10일에 흩어 넣어 둬(미래 날짜 금지, 최근일수록 조금 많게). 입력은 흔한 한국 이름·1985~2006년생으로 무작위로 만들되 점수는 위 공식으로 실제 계산해 분포가 자연스럽게. 관계 유형은 연인 50%·썸 30%·친구 20%. [제외] 참여자 로그인·히스토리, 정통 사주·명리 계산, 유료 결과, 광고, 카카오 SDK(앱 키가 필요). [화면] 모바일 우선 — 폭 360px 휴대폰에서 입력이 한 화면 안에 들어오고, 한 손으로 누르기 쉬운 큰 버튼. [확인] 마치기 전에: 두 사람 순서를 바꿔 넣어도 같은 점수·같은 결과 주소인지, /api/s/{input_hash} 를 curl 로 요청하면 결과별 og 태그가 나오는지.
🧭 이렇게 이해했어요: 화면·관리자·계산 규칙·공유 미리보기가 많아 한 번에 만들면 어긋나기 쉬워요. 획수표 같은 빈 곳을 먼저 정하고 단계별 계획을 확인받은 뒤 만들게요.
확인이 필요해요 — 자모 획수표처럼 '하나 정해 고정'이라고 하신 부분은 계획 문서에서 제가 정한 값을 보여드리고 확인받는 것으로 이해했어요. 다른 뜻이면 알려주세요. 미리 알려드려요 — 카카오 공유 SDK는 앱 키가 필요해 쓰지 않고, 기기 공유창(Web Share API)과 링크 복사로 대신해요. 미리 알려드려요 — 카카오톡 등 링크 미리보기는 배포된 공개 주소에서만 확인되며, 이미 한 번 읽힌 주소는 카톡 쪽 캐시 때문에 바뀐 내용이 늦게 반영될 수 있어요.
실행과정10개 작업
계획
record_decision
record_decision
record_decision
record_decision
record_decision
record_decision
파일 생성
파일 생성
계획
실행결과 · 5분 3초 소요
궁합 테스트의 기획 문서와 개발 계획 문서를 작성했습니다. 아직 만들기 전이고, 문서를 확인하신 뒤 개발을 시작합니다. 주신 계산 규칙과 문구는 그대로 씁니다. **어떤 서비스인가요** - 두 사람 이름만 넣어도 0~100점 궁합 점수, 등급, 한 줄 해설이 나옵니다. 생년월일과 MBTI를 더 넣으면 띠·별자리·생체 리듬·성격 궁합이 점수에 더해집니다. - 같은 두 사람과 같은 관계면 언제나 같은 결과가 나옵니다. 나와 상대를 바꿔 넣어도 결과와 결과 주소가 같습니다. - 화면은 고르신 비주얼 노벨 스타일로, 분홍빛 하늘 위에 대화창이 떠 있는 모습입니다. **화면** 1. **첫 화면**: 제목, 참여한 쌍 수, 나와 상대 입력 칸, 관계(연인·썸·친구), [궁합 보기] 버튼이 휴대폰 한 화면 안에 들어옵니다. 2. **결과 화면** - 두 이름을 하트로 잇고 큰 점수, 게이지, 등급과 해설, "상위 ○%"를 보여 줍니다. - 잘 맞는 점, 주의할 점, 항목별 점수 막대가 이어집니다. - 버튼은 [공유하기], [이미지로 저장], [우리도 해보기]입니다. 친구가 보낸 링크로 들어온 사람에게는 [우리도 해보기]가 가장 크게 보입니다. 3. **관리자 화면**: 주소 끝에 /admin 을 직접 쳐야만 들어갈 수 있습니다. 체험용 계정은 admin / demo1234 입니다. - 통계: 참여 수, 최근 30일 하루별 참여, 점수 분포, 등급별 비율, 관계별 평균 점수를 봅니다. - 문구 관리: 해설 문구를 고치면 이미 나온 결과에도 바로 반영되고, 처음 문구로 되돌릴 수도 있습니다. **요청에서 비어 있던 부분은 이렇게 정했습니다** - **이름 획수**: 흔히 쓰는 이름 궁합 획수표 하나로 고정합니다(ㄱ 2획, ㅁ 4획, ㅇ 1획처럼). - **띠**: 태어난 해(양력)로 정합니다. - **장점·주의점 개수**: 생년월일 없이 이름과 MBTI만 넣으면 계산에 들어가는 항목이 2개뿐입니다. 이때 잘 맞는 점과 주의할 점에 같은 항목이 겹치지 않도록 하나씩만 보여 줍니다. - **이름 순서**: 결과와 공유 제목의 두 이름은 입력한 순서가 아니라 가나다 순으로 보입니다. 누가 열어도 같은 결과여야 하기 때문입니다. **공유와 저장** - 카카오톡 같은 메신저에 링크를 붙이면 "민준 ♥ 서연 궁합 87점" 같은 제목과 분홍 하트 그림이 미리보기로 뜹니다. 이 미리보기는 배포 버튼을 눌러 공개 주소를 만든 뒤에 확인할 수 있습니다. - 생년월일과 MBTI는 저장하지 않습니다. - 참여 수가 0으로 보이지 않도록 지난 10일 동안 12쌍이 본 예시 기록을 넣어 둡니다. 점수는 실제 규칙으로 계산합니다. 작성한 문서: - -
✅ 파일 2개 수정
4,935.2원 사용
개발 시작10월 8일 오전 04:32계획 확인 후 시작
계획 문서(docs/개발-계획.md)의 순서대로 개발을 시작합니다.
실행과정82개 작업
계획 문서를 먼저 확인하겠습니다.
파일 읽기
파일 읽기
계획 문서를 확인했습니다. 개발을 시작하겠습니다. 먼저 현재 워크스페이스 구조를 파악하겠습니다.
파일 목록
파일 목록
파일 목록
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
구조를 파악했습니다. 계획을 세우고 의존성 설치부터 진행하겠습니다.
계획
명령 실행
명령 실행
bcrypt 최신 버전이 go 1.26을 요구해서, go 1.23에 맞는 버전으로 지정하겠습니다.
명령 실행
의존성 설치가 완료됐습니다. 이제 예시 데이터 파일과 디자인 CSS를 작성하겠습니다.
파일 생성
파일 생성
파일 수정
이제 API 계층(예시 데이터 반환)과 공통 상수를 만들고, 세 화면을 작성하겠습니다.
파일 생성
파일 생성
계획
파일 생성
파일 수정
파일 수정
파일 수정
파일 생성
파일 수정
파일 수정
파일 생성
이제 라우터(App.jsx)를 작성해 세 화면을 연결합니다.
파일 생성
세 화면을 완성했습니다. 로그로 오류를 확인하겠습니다.
로그 확인
오류 없이 HMR이 반영됐습니다. 화면 코드에 hex·이모지가 없는지 확인하겠습니다.
코드 검색
코드 검색
2단계 완료로 판단하고 3단계(Go 계산 엔진)로 넘어갑니다.
계획
파일 생성
파일 생성
명령 실행
테스트가 통과했습니다. 이제 4단계 — DB 스키마·시드·공개 API를 만들겠습니다.
파일 생성
이제 공개 API 핸들러를 작성하고 main.go 를 확장합니다.
파일 생성
계획
파일 수정
파일 수정
앱 재시작
컴파일·healthy 확인. 프론트를 실제 API로 전환합니다.
파일 생성
파일 수정
파일 수정
파일 수정
파일 수정
명령 실행
로그 확인
명령 실행
명령 실행
공개 API가 정상 동작합니다(순서 교차 시 같은 주소, created=false). 5단계로 넘어갑니다.
계획
파일 생성
파일 수정
파일 생성
파일 수정
파일 수정
파일 수정
파일 수정
앱 재시작
명령 실행
공유 미리보기와 대표 이미지가 정상 동작합니다. 이제 6단계 — 관리자 기능을 만듭니다.
파일 생성
파일 수정
파일 수정
계획
파일 수정
파일 생성
파일 읽기
파일 수정
파일 수정
앱 재시작
명령 실행
명령 실행
관리자 문구 수정이 결과·공유 메타에 즉시 반영되고 이스케이프도 정상입니다. 6단계 완료, 최종 확인으로 넘어갑니다.
계획
로그 확인
코드 검색
명령 실행
명령 실행
파일 생성
계획
실행결과 · 13분 7초 소요
개발을 완료했습니다. 계획 문서 순서대로 ①~⑦ 단계를 모두 끝냈고, 계산 규칙·문구는 요청하신 확정값 그대로 반영했습니다. **무엇을 만들었나** - **Go 계산 엔진** (``) — 이름 획수·띠·별자리·운명수·3종 리듬·MBTI 점수와 최종 점수·등급을 한 곳에서 계산합니다. 계획서의 테스트 벡터 전부 통과했습니다(김민준♥이서연 이름궁합 8, 띠 61, 별자리 82, 운명수 69, 리듬 99/98/6 등). - **입력 `/`** — 참여 카운터(지금까지 12쌍 + 오늘 2쌍), 나/상대 입력, 관계 선택, 한쪽만 넣은 경우 안내, [궁합 보기]. - **결과 `/result/{hash}`** — 점수·게이지·등급·해설·상위 %, 잘 맞는 점/주의할 점, 항목별 점수 막대, 공유/이미지 저장/우리도 해보기(공유로 들어온 사람은 "우리도 해보기"가 가장 크게). - **공유 `/api/s/{hash}`** — 결과별 OG 메타가 담긴 HTML로, `location.replace` 로 결과 화면으로 보냅니다. 대표 이미지 `/`(1200×630 PNG, 하트 그림)도 서버가 그려 둡니다. - **관리자 `/admin`** — admin / demo1234 로그인, 통계 5종, 문구 관리(고치면 기존 결과·공유 메타에 즉시 반영, 되돌리기 포함). **검증한 것** - 나/상대 순서를 바꿔 넣어도 같은 주소(`734deafc5b3a`), 같은 점수. - 같은 입력 재전송 시 `created:false`(기록 안 늘어남). - `/api/s/{hash}` curl → 결과 이름·점수가 든 og:title, meta refresh 없음, 해설 속 따옴표가 `&#34;` 로 이스케이프됨. - 이름만 넣은 경우 잘 맞는 점·주의할 점 각 1개. - `go test`·`go vet` 통과, 참여자 화면에 관리자 링크 없음. **참고**: 미리보기에서 카운터가 "12쌍"으로 보이는 것은 요청하신 **예시 시드 기록**(지난 10일에 흩뿌린 12쌍) 때문이며, 실제로 계산한 결과가 맞습니다. 공유 미리보기(카톡 썸네일)는 **배포 버튼으로 공개 주소를 만든 뒤**에 정확히 확인할 수 있습니다.
실행과정1개 작업
로그 확인
🔎 완료 검토: 합격
확인이 필요해요 — 루트 화면은 실데이터(누적 14쌍, 오늘 4쌍)로 보인다. 다만 이 수치는 시드로 넣은 결과일 수 있다. 응답 요약에서 이 수치가 실제 참여인지 시드 예시인지 사용자에게 알렸는지는 확인하지 못했다.
실행결과 · 13분 36초 소요
로그를 확인했습니다. 최근 Go 빌드(`go build`)와 `api listening on :8000` 재시작이 정상적으로 이뤄졌고, Vite HMR도 오류 없이 반영됐습니다. 마지막 재시작 이후에 Go 소스를 추가로 수정하지 않았으므로 서버는 최신 상태입니다. 이전 로그에 남아 있던 `[browser] useContext/useState` 오류는 초기 의존성 최적화 재로딩 시점의 일시적 현상으로, 그 뒤 `optimized dependencies changed. reloading` 이후 재로딩되며 해소됐습니다. 현재 로그에 새 `[browser]` 오류나 `go build` 실패가 없음을 확인했습니다. 작업을 마무리합니다. 최종 요약은 앞서 드린 내용 그대로이며, 모든 기능이 완성되어 있습니다.
✅ 파일 40개 수정 · 명령 11개 실행 · 앱 재시작
3,443원 사용
이 프로젝트는 AI 에이전트와의 대화만으로 만들어졌습니다
project-f25ce5.glidev.ai
↗
파일
왼쪽에서 파일을 선택하세요