Fable · 산토끼의 정문 재설계 · 2026-08-07

물건은 어디에나 있다.
물음은 여기에만 있다.

비로그인 산토끼가 보는 정문(/)과 그 너머의 2차 화면(골목·가게·물건)을 다시 설계한다. 원칙은 하나 — 채우는 것이 아니라, 칸마다 일어나는 일을 만든다. 거짓 활기는 0.

32
우벨이 서명한 물음(판게아 15는 종교 어휘 0)
0
진짜 가게 — 문패 10개는 전부 본보기(is_demo)
1
주문 총합 — 숫자 자랑은 전부 금지 구역
20
실물 매물 — 사진만 시연용(Pexels)
쿠팡·당근·네이버는 물건으로 이기는 집이다. 우리는 그 판에서 못 이기고, 이길 필요도 없다. 우벨의 정문이 가진 남들에게 없는 두 가지 — ① 오늘 우벨이 당신에게 묻는 것(광장의 물음), ② 이 골목을 누가 여는가(여는 주체). 이 둘을 각주에서 심장으로 끌어올리고, 물건은 그 아래에 세운다.

판단설계 전에 내린 결정 다섯

① 첫 화면의 주인은 물건이 아니라 물음이다.

지금 히어로("동네 가게의 물건, 오늘의 이야기")는 당근의 문장이다. 당근에 이미 있는 문장으로는 "여긴 뭔가 다르다"가 안 나온다. 오늘의 물음 한 개를 히어로로 올린다 — 큰 글씨의 질문 하나, 우벨의 서명, 그리고 "들어가면 이름 없이 답할 수 있다"는 문 하나. 판게아 물음 15개는 종교 어휘가 0이라 정문에 그대로 걸 수 있고, 날짜로 돌리면 매일 정문이 달라진다 — 어제 온 사람이 오늘 또 올 이유가 정문 자체에 생긴다.

② "누구에게서"는 각주가 아니라 상인방(문 위의 가로대)이다.

"이 골목은 호남신학대학교가 이웃을 위해 엽니다"는 이 제품에서 가장 힘 있는 한 줄인데 화면 맨 아래 각주에 있었다. 골목 섹션의 머리로 올린다 — 문패 줄 위에 금색 가로대(상인방)로 얹는다. 쿠팡과 다른 근거는 알고리즘이 아니라 여는 주체가 실명의 조직이라는 사실이고, 이건 PIPA 경계 안이다(여는 주체는 공개 가능).

③ 빈 상태의 문법을 "조용해요"에서 "자리를 내어드립니다"로 바꾼다.

"지금은 골목이 조용해요"는 정직하지만 죽어 있다 — 결핍을 보고한다. 같은 사실을 약속의 방향으로 말한다: "첫 열 자리는 본보기로 세웠어요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다." 이 문장은 코드가 실제로 하는 일이다(진짜 가게가 서면 본보기가 목록에서 물러나는 규칙이 이미 구현되어 있다). 본보기 문패에는 "본보기" 도장을 찍는다 — 숨기는 대신 공사 중인 골목의 조감도로 정직하게 세운다.

④ 2차 화면의 막다른 길은 세 군데였고, 세 개의 문으로 뚫는다.

골목 목록의 끝 → 빈 터 카드("여기는 다음 가게의 자리예요" → 가게 주인의 문). 본보기 가게의 단면 → "이 자리에 내 가게 세우기"(본보기 가게에서 전화·발걸음은 거짓이 되므로 그 자리를 개설 문으로 바꾼다). 물건 카드 → 바텀시트(가격·수확일·"이 물건은 어느 좌판에 있는가" → 가게 앞으로). 전부 로그인 0·개인정보 0·거짓 0으로 가능하다.

⑤ 산토끼 셋의 갈림은 링크 두 줄이 아니라 "세 개의 문" 섹션이다.

주민은 정문의 본문 전체가 자기 것이니 문이 필요 없다. 목사·노회장(→ /org, ?k= 칩이 이미 가른다)과 가게 주인(→ /shop)에게는 문 모양의 카드 두 개를 준다 — 골목 섹션 바로 아래, 상인방 모티프를 이어받은 자리. 지금처럼 히어로 밑 마이크로 텍스트로 두면 매일 오는 주민에게는 소음이고 어쩌다 오는 관리자에게는 안 보인다. 스크롤 아래 한 번, 제대로 된 문으로.


A정문(/) — 첫 화면

스크롤 없이 보이는 것: 오늘의 물음(심장) + 상인방을 얹은 골목의 첫 줄. 물건 그리드는 한 스크롤 아래에서 그대로 산다 — 당근 공식(재화 공개)은 버리지 않는다, 순서만 바꾼다.

MOCK 1정문 · 첫 화면(비로그인)/
전체 ▾

우벨이 묻습니다 · 8월 7일의 물음

요즘 누구의 안부가
궁금한가요.

우벨이 매일 하나씩 묻습니다 — 사람이 아니라 우벨의 서명입니다

이 물음은 광장에 걸려 있어요. 들어가면 이름 없이 한 줄로 답할 수 있어요. 아직 첫 답을 기다리고 있어요.

광장에서 답하러 가기 어제의 물음 ↓
이 골목은 호남신학대학교가 이웃을 위해 엽니다
양림양림상점본보기 나무나무결공방본보기 한그한그릇본보기 카페카페소하본보기 소망소망상회본보기 골목 걷기

첫 열 자리는 본보기로 세웠어요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.

왜 물음이 히어로인가. 물건 목록으로 여는 정문은 "당근보다 작은 당근"으로 읽힌다. 물음으로 여는 정문은 비교 대상이 없다 — 첫 3초의 판정이 "장터네"에서 "나한테 말을 거네"로 바뀐다.

왜 답 개수를 안 보여주나. 오늘 답은 0건이다. "0명이 답했어요"는 죽은 숫자, 지어낸 숫자는 금지. "아직 첫 답을 기다리고 있어요"는 0건이라는 같은 사실을 자리의 문법으로 말한다 — 그리고 첫 답이 생기는 날 이 줄이 자연히 "답 N개가 도착했어요"로 자란다.

왜 "우벨의 서명" 한 줄을 넣나. 씨앗 글 192건을 지운 이유와 같은 이유로, 이 물음이 사람인 척하지 않는다는 것을 화면이 스스로 밝힌다. 정직이 이 카드의 힘이다.

물음은 판게아 15개만 쓴다. 날짜 인덱스로 돌린다(오늘 = day-of-year mod 15). 기도 물음 17개는 정문에 오지 않는다 — 종교 어휘 0 경계.

MOCK 2정문 · 이어지는 스크롤/ (계속)

오늘의 직거래 전체

더 보기 →
사진 · 시연용
햇감자 10kg
18,000원
소망상회 좌판
사진 · 시연용
유기농 상추
4,500원
참진농원 좌판
사진 · 시연용
재래식 된장 1kg
15,000원
은혜식품 좌판
사진 · 시연용
천연발효빵
7,000원
한빛베이커리 좌판

물건 사진은 시연용 샘플이에요 · 사진 제공 Pexels. 물건을 누르면 어느 좌판인지부터 보여드려요.

어제까지의 물음

8·6그만두고 싶었지만 아직 하고 있는 일이 있나요.
8·5최근에 마음이 놓였던 순간은 언제였나요.
8·4누구에게도 자랑하지 못한 작은 성취가 있나요.

다른 문으로 들어오실 분

교회·학교·노회를 맡고 계신가요
단톡방이 알려주지 않는 것을 우벨은 알려드려요
가게나 농장을 하시나요
이 골목의 다음 문패는 비어 있어요
발걸음 세 번이면 단골
구경은 가입 없이. 가게에 말 걸고 단골로 기억되는 건 로그인 뒤의 일이에요.
시작하기
ubell · 세상 모든 울림을 하나로
매물 사진은 시연용 샘플입니다 · 사진 제공 Pexels

물건 그리드는 살리고 좌판 이름을 단다. 각 물건에 "○○ 좌판" 한 줄 — "누구에게서" 축을 카드 단위까지 내려보낸다(상호는 간판이 이미 공개한 사실, PIPA 경계 안).

"어제까지의 물음"이 비워진 "오늘의 이야기" 칸을 잇는다. 씨앗 글 삭제로 빈 자리를, 실제 DB에 있는 물음 행들로 채운다 — 지어낸 이야기 0, 그리고 "매일 달라지는 정문"의 증거가 된다.

세 개의 문. 주민에겐 본문 전체가 자기 문이라 따로 만들지 않는다. 관리자·가게 주인 문은 상인방 모티프(문틀 위 금색 가로대)를 이어받아 "문"으로 보이게 — 텍스트 링크 두 줄이 아니라.

데스크톱(1180px) — 같은 재료의 2단 배치. 물음이 좌상단(시선 시작점), 골목 상인방이 전폭으로 그 아래를 받친다.

오늘의 물음 (히어로)질문 + 서명 + 광장 문 + 어제까지의 물음
세 개의 문관리자의 문 · 가게 주인의 문 (우측 레일 상단)
골목 (전폭)상인방 "호남신학대학교가 엽니다" + 문패 줄 + 본보기 문장
오늘의 직거래물건 그리드(좌판 이름 포함)
단골 CTA 밴드발걸음 세 번이면 단골

B2차 화면 — 막다른 길 셋을 문으로

골목 목록의 끝, 본보기 가게의 안, 물건 카드의 탭 — 지금은 셋 다 벽이다. 셋 다 로그인 없이 열리는 문으로 바꾼다.

MOCK 3골목 목록 — 상인방을 머리로, 끝에는 빈 터/madang/market
지금 3곳 열림
이 골목은 호남신학대학교가 이웃을 위해 엽니다
가게가 아니라 이웃이 먼저인 골목 — 문패마다 여는 이의 이름이 있어요.
양림 양림상점 본보기 잡화 · 광주 남구 · 10:00–19:00 “이런 모습으로 골목에 서게 됩니다.”
나무 나무결공방 본보기 지금 열림 공방 · 광주 남구 · 11:00–18:00
한그 한그릇 본보기 밥집 · 광주 남구 · 11:30–20:00
?
여기는 다음 가게의 자리예요
가게나 농장을 하시면 이 골목에 문패를 걸 수 있어요. 진짜 가게가 서면 본보기가 한 자리 물러납니다.
이 자리에 문패 걸기 →

목록 다음에 오는 것 = 빈 터. 지금은 목록이 끝나면 각주 한 줄로 끝난다. 빈 터 카드는 목록의 마지막 항목으로 서서, 골목을 "다 지어진 곳"이 아니라 "자리가 나는 곳"으로 읽게 한다. 막다른 길이 /shop 으로 가는 문이 된다.

"지금은 닫혀 있어요"를 문패에서 뗀다. 본보기 가게의 영업시간은 실제 사건이 아니다 — 닫힘/열림을 개별 문패에 다는 대신 "본보기" 도장 하나로 정직을 다한다. 열림 배지는 hours 데이터가 계산되는 동안만 보조로 남긴다.

MOCK 4가게 단면 — 본보기일 때/madang/market/[slug] (is_demo)
소망 소망상회 본보기
농산 · 광주 남구
이 가게는 본보기예요. 진짜 가게가 어떤 모습으로 서는지 보여드리려고 세웠어요. 진짜 가게가 오면 이 자리를 내어줍니다.
문 여는 때10:00–19:00 (본보기 시간표)
다루는 것햇감자 18,000원 · 방울토마토 8,000원
이 자리의 진짜 주인을 기다리고 있어요
가게나 농장을 하시면, 문패·시간표·좌판이 이렇게 차려져요.
이 자리에 내 가게 세우기 →

본보기 가게에서 전화·길찾기·발걸음을 전부 걷는다. 없는 번호로 "전화로 물어보기"를 두는 것도, 본보기 가게에 "다녀왔어요"를 받는 것도 그 순간 화면이 거짓이 된다. 본보기 단면의 유일한 행동은 개설의 문 하나 — 이 화면의 손님은 사실상 가게 주인 후보다.

진짜 가게 단면(is_demo=false)은 지금 구조를 유지하고 한 가지만 더한다: [전화로 물어보기] [길 찾기] 옆에 [가게 명함 보내기] — 상호·주소·시간·링크를 복사/공유하는 버튼. 로그인 0·개인정보 0·서버 0으로 되는, 비로그인 손님이 골목을 넓히는 첫 행동이다. 다녀왔어요(발걸음)는 이미 비로그인도 누를 수 있게 구현되어 있으니("이 폰이 기억하는 중") 그대로 둔다.

MOCK 5물건 바텀시트 — 탭이 처음으로 어딘가로 간다/ · 물건 카드 탭
전체 ▾
사진
햇감자 10kg
18,000원
사진
유기농 상추
4,500원
사진 · 시연용 샘플 (Pexels)
햇감자 10kg
18,000원 / 10kg
8월 2일 수확

이 물건은 소망상회 좌판에 있어요. 값을 치르는 건 가게 앞에서 — 이 화면이 하는 일은 발걸음이에요.

가게 앞으로 가기 → 명함 보내기

왜 상세 페이지가 아니라 시트인가. 물건의 목적지는 물건이 아니라 가게다("장바구니 담기"가 아니라 "문을 열게 하기" — 가게 단면의 설계 원칙 그대로). 시트는 골목의 흐름을 끊지 않고 한 손가락으로 "누구에게서 → 가게 앞으로"를 잇는다. 새 라우트도, 새 테이블도 필요 없다 — market_listings.market_id 가 이미 있다.

결제 버튼이 없는 이유를 화면이 스스로 말한다. "값을 치르는 건 가게 앞에서" — 기능의 부재를 숨기는 대신 오프라인 골목의 원칙으로 선언한다.


C문장표 — 규칙표 v1 검사 완료

검사법: "이 문장이 말하는 사건을, 오늘 DB에서 한 행이라도 보여줄 수 있는가." 통과 못 하는 문장은 지우지 않고 아직 못 쓰는 문장으로 표시해 두었다 — 쓸 수 있게 되는 날을 함께 적었다.

화면문장이 문장이 말하는 사건오늘 DBX면 언제 쓸 수 있나
정문 히어로우벨이 묻습니다 · 8월 7일의 물음plaza_questions 에 오늘 걸 물음 행이 있다 (판게아 15)O
정문 히어로요즘 누구의 안부가 궁금한가요.000202 로 심은 물음 원문 그대로 (판게아만 사용)O
정문 히어로우벨이 매일 하나씩 묻습니다 — 사람이 아니라 우벨의 서명입니다물음의 저자가 우벨이라는 사실 (씨앗 글 아님)O
정문 히어로이 물음은 광장에 걸려 있어요. 들어가면 이름 없이 한 줄로 답할 수 있어요.광장 방(판게아)이 존재하고 익명 답이 기능으로 열려 있다 (000201)O
정문 히어로아직 첫 답을 기다리고 있어요.이 물음에 달린 답이 0건이라는 사실 그 자체O답이 생기면 자동으로 아래 줄로 교체
정문 히어로이 물음에 답 N개가 도착했어요.plaza_posts 에 이 물음의 답 행이 1건 이상X광장에 첫 답이 달리는 날 — 위 "기다리고 있어요" 줄과 자동 교대
정문 골목이 골목은 호남신학대학교가 이웃을 위해 엽니다markets.church_id → churches 행 (resolveHost 가 이미 계산)O
정문 골목첫 열 자리는 본보기로 세웠어요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.is_demo=true 10행 + 진짜가 서면 본보기가 물러나는 목록 규칙(코드에 구현됨)O
문패 도장본보기markets.is_demo = trueO
골목 목록지금 3곳이 문 열었어요hours 시간표와 현재 시각의 계산 (기존 문장 유지)O
골목 목록여기는 다음 가게의 자리예요골목 정원(10) 대비 진짜 가게 0 — 빈 자리가 실재한다O
골목 목록가게나 농장을 하시면 이 골목에 문패를 걸 수 있어요.가게 개설 흐름(/shop)이 실제로 존재O
가게(본보기)이 가게는 본보기예요. 진짜 가게가 오면 이 자리를 내어줍니다.is_demo=true + 물갈이 규칙O
가게(본보기)이 자리에 내 가게 세우기 →/shop 개설 문 존재O
가게(진짜)가게 명함 보내기상호·주소·시간·링크 — 전부 markets 공개 컬럼, 복사/공유는 클라이언트O구현과 동시에 (서버 작업 0)
물건 시트이 물건은 소망상회 좌판에 있어요.market_listings.market_id → markets.nameO
물건 시트값을 치르는 건 가게 앞에서 — 이 화면이 하는 일은 발걸음이에요.온라인 결제가 이 화면에 없다는 사실의 선언O
물건 시트사진은 시연용 샘플 (Pexels)Pexels 표기 의무 + 시연 사실 (기존 유지)O
정문 물건소망상회 좌판 (물건 카드의 출처 줄)market_listings.market_id 연결O
세 개의 문가게나 농장을 하시나요 — 이 골목의 다음 문패는 비어 있어요진짜 가게 0 = 빈 문패가 실재O
정문 골목이번 주 이 골목에 발걸음 N번이 닿았어요.shop_visits 주간 합계 N ≥ 1X진짜 가게에 첫 발걸음들이 쌓이면 — 본보기 가게의 발걸음은 세지 않는다
가게(진짜)단골 N명이 이 가게를 기억해요.발걸음 3번 이상 손님 N ≥ 1X단골 1호가 태어나는 날
정문 히어로오늘 N명이 광장을 다녀갔어요.비로그인 방문 계측 — 지금 계측 자체가 없다X퍼널 계측을 되살리기로 결정한 뒤에도, 켤지는 별도 판단(숫자 자랑은 밀도가 낮을 때 역효과)
⚠구현자에게 — JSX 함정 두 가지. ① 위 문장은 전부 한 문장 = 한 줄(템플릿 리터럴 하나)로 옮길 것 — 여러 줄로 쪼개면 공백이 사라져 "어느 교회가봤는가" 사고가 재발한다. ② 조사는 lib/korean.tsparticle() 로 — 이 표의 문장은 조사 분기가 필요 없는 형태로 썼지만, 가게 이름이 변수로 들어가는 자리("소망상회 좌판에")는 {`${name} 좌판`} 처럼 조사가 안 붙는 구조를 유지했다. 이름 뒤에 조사가 필요해지면 반드시 particle().

부록지금 문장 → 새 문장 교체표

자리지금 (정직하지만 죽은)제안 (정직하고 살아 있는)
정문 히어로동네 가게의 물건, 오늘의 이야기오늘의 물음 카드가 히어로 자체가 된다 (문장 교체가 아니라 구조 교체)
골목 부제지금은 골목이 조용해요첫 열 자리는 본보기로 세웠어요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.
문패 상태지금은 닫혀 있어요 (본보기 가게에)본보기 (도장) — 열림/닫힘은 진짜 가게에만 단다
골목 각주이 골목은 호남신학대학교가 이웃을 위해 엽니다. (맨 아래)같은 문장, 자리만 상인방(섹션 머리)으로 — 문장은 이미 옳았다
목록의 끝(없음 — 막다른 길)여기는 다음 가게의 자리예요 (빈 터 카드)

Fable · 산토끼의 정문 · 우벨 디자인 시스템(ms-* 토큰, 밝음/어둠 두 세계) 기준으로 그림