ubell 디자인 의뢰 · 로그인 다음 판
오너의 말: "무조건 인증번호를 받게 보인다. 산토끼용과 집토끼용이 기본이고, 산토끼용은 선택해서 들어가게 해야지." 이 문서는 그 "이상하다"의 정체를 판정하고, 갈림 화면 없이 갈림을 세우는 목업입니다. 코드는 건드리지 않았습니다.
1부
2부
정문의 문장을 고치지 않습니다. 고칠 것은 문입니다.
plaza_posts_list(000089)는 글쓴이를 '익명 {별칭}'으로만 내리고, 실명 display_name은 내리지 않습니다. "이름 없이 한 줄로 답할 수 있어요"는 광장에 이름이 걸리지 않는다는 약속이고, 그 약속은 지켜지고 있습니다. 깨진 것은 문입니다 — create_plaza_post는 로그인(auth.uid())만 요구할 뿐 번호를 요구하지 않는데(이메일 매직링크·구글로도 계정은 섭니다), 로그인 화면이 번호를 유일한 길처럼 보여서 "이름 없이라더니 번호를 내라네"로 읽힙니다.
next=를 붙여야 이 화면이 성립합니다(지금은 안 붙입니다 — 5부 X 항목).
3부
첫 문장이 다른 이유는 각 사람이 문 앞에서 품는 의심이 다르기 때문입니다. 문장은 그 의심 하나에만 답합니다.
| 누가 | 어떻게 아는가 | 첫 문장 | 왜 이 문장인가 |
|---|---|---|---|
| 집토끼 (초대 링크) | 초대 도착지가 심은 ubell:returnTo=/join/{token} | "명부와 이어드릴게요" | 이 사람의 의심은 "내 교회가 맞나"입니다. 번호가 명부의 열쇠(link_member_by_phone)이므로 번호가 큰길인 이유를 말해 줍니다. |
| 가게 주인 | next=/shop/open·/shop/sell·/shop/mine | "문패를 세우러 오셨군요" | 이 사람의 의심은 "왜 번호를 내라는 거지"입니다. 이유를 사실로 답합니다: 골목에는 번호가 확인된 가게만 보입니다(create_market → DRAFT 잠금). 강요가 아니라 사실 고지입니다. |
| 광장에 답하러 온 사람 | next=/mizpah/… (⚠지금은 안 붙음 — 수리 필요) | "이름은 광장에 걸리지 않아요" | 이 사람의 의심은 "이름 없이라더니?"입니다. 정문의 약속을 문이 반복하고, 번호 없는 길(이메일·구글)을 큰길로 올립니다. |
| 모를 때 (기본값) | next 없음 · returnTo 없음 | "어서 오세요" + "휴대폰 번호가 있으면 문자 한 통으로 들어와요" | 기본은 지금처럼 번호가 큰길입니다 — 계정 311의 절대다수가 명부(313명)의 사람이고, 번호만이 명부와 자동으로 잇는 열쇠이기 때문입니다. 다만 "다른 방법"을 "번호 없이 들어오기"로 바꿔, 선택이 있다는 사실 자체를 문장으로 세웁니다. 오너가 본 "무조건 인증번호"는 이 낱말 하나가 만든 착시입니다. |
4부
뼈대는 넷 다 같습니다: 종 마크 → 워드마크 → (명패) → 제목 → 한 줄 → 입력 → 큰 단추 → 조용한 줄. 달라지는 것은 명패·문장·길의 순서뿐입니다. 우상단 "밝음 · 어둠" 단추로 두 세계를 확인하세요.
A · 기본 — 어디서 왔는지 모름
바뀐 것은 맨 아래 낱말 하나
B · 가게 주인 — next=/shop/open
번호가 필요한 이유를 사실로 말한다
C · 광장에서 온 사람 — next=/mizpah/pangea
정문의 약속을 문이 반복한다 · 번호는 조용한 줄로
D · 초대 링크로 온 집토끼 — returnTo=/join/{token}
번호가 명부의 열쇠임을 말한다 · 딴 데로 새는 길은 내밀지 않는다
ubell
양림교회의 초대명부에 있는 그 번호로 문자를 받으면 양림교회와 자동으로 이어집니다.
다른 번호여도 괜찮아요 — 초대장이 있어서, 들어오면 바로 합류합니다.
sessionStorage의 초대 토큰이 못 따라가므로, 그 길로 보내면 초대가 끊깁니다(LoginForm.tsx 주석에 이미 적힌 사실). 끊어질 길은 내밀지 않습니다. 비밀번호는 같은 탭이라 returnTo가 살아 있어 남겨 둡니다.
next=를 읽지 않고 returnTo(초대 전용)만 봅니다. 사장님은 지금 set-password → /my → /onboarding으로 떠내려갑니다. 이 문장을 화면에 걸려면 verifyCode가 nextParam() ?? readReturnTo()를 보게 하는 한 줄 수리가 선행돼야 합니다. 수리 전에는 이 한 줄을 화면에서 빼야 합니다 — 화면이 약속한 것을 제품이 안 지키는 그 실패를 여기서 반복하지 않기 위해서입니다.
5부
| 화면 | 문장 | 말하는 사건 | 오늘 참인가 |
|---|---|---|---|
| 정문 (QuestionCard) | "들어가면 이름 없이 한 줄로 답할 수 있어요." | plaza_posts_list가 글쓴이를 '익명 {별칭}'으로만 공개 (000089) | O |
| A 기본 | "휴대폰 번호가 있으면 문자 한 통으로 들어와요." | signInWithOtp(phone) → verifyOtp → link_member_by_phone | O |
| A 기본 | "번호 없이 들어오기 — 이메일 · Google" | signInWithOtp(email 매직링크) · signInWithOAuth(google)로 계정 성립 | O |
| B 가게 | "골목에는 번호가 확인된 가게만 보여요." | create_market: profiles.phone 없으면 status=DRAFT (000158) · 골목·정문은 ACTIVE/ACTIVE_LIMITED만 노출 | O |
| B 가게 | "문패는 번호가 확인될 때까지 골목에 서지 않아요." (이메일·구글 경고) | 이메일·구글 계정에는 phone이 없어 DRAFT 잠금 · 뒤에 번호로 들어오면 market_publish_if_verified(000207)가 스스로 푼다 | O |
| B 가게 — 진입 감지 | (명패) "가게 문패 걸기" | /shop/open·/shop/sell·/shop/mine이 next=를 붙여 보낸다 | O |
| B 가게 — 복귀 약속 | "확인이 끝나면 문패 걸기로 돌아갑니다." | verifyCode가 next를 읽어 되돌려 보낸다 | X — verifyCode는 returnTo만 읽음(LoginForm.tsx:192). nextParam ?? returnTo 한 줄 수리 필요. 수리 전엔 문장 게시 금지 |
| C 광장 | "이름은 광장에 걸리지 않아요." | _plaza_allows_anon=true · 피드·상세·댓글 전부 익명 별칭 (000089) | O |
| C 광장 | "휴대폰 번호는 필요하지 않습니다." | create_plaza_post는 auth.uid()만 요구 — 이메일·구글 계정으로 충분 | O |
| C 광장 — 진입 감지 | (명패) "오늘의 물음에 답하러" | 미스바가 next=/mizpah/…를 붙여 보낸다 | X — mizpah/[plazaSlug]/page.tsx:14 등 5곳이 next 없이 redirect('/auth/login'). next 붙이는 한 줄 수리 필요 |
| D 초대 | "명부에 있는 그 번호로 문자를 받으면 교회와 자동으로 이어집니다." | verifyOtp 직후 link_member_by_phone이 명부·소속·관리자 자리까지 자동 연결 | O |
| D 초대 | "다른 번호여도 괜찮아요 — 초대장이 있어서, 들어오면 바로 합류합니다." | join_church_by_invite(p_token)는 번호 일치와 무관하게 합류시킨다 (JoinInvite.join) | O |
| D 초대 — 복귀 | (동작) 로그인 뒤 /join/{token}으로 돌아간다 | JoinInvite.begin이 심은 ubell:returnTo를 verifyCode·handlePassword가 읽는다 | O — 단 매직링크·구글은 다른 탭이라 끊김 → D에서 그 길을 내밀지 않는 이유 |