부동산 인텔리전스 플랫폼
Reevl
요약
한국 아파트 시장의 상태를 읽는 부동산 인텔리전스 플랫폼이다. 1인으로 설계하고 개발해 출시했고, 지금도 직접 운영한다.
- 45,695
- 8
- 64,817
개요
Reevl은 한국 아파트를 위한 부동산 터미널이다. 아파트 단지를 상장 종목처럼 다룬다. 가격 차트, 등락률, 단지가치를 붙여 시장 상태를 한눈에 읽게 한다.
2026년 4월에 시작해 2026년 7월에 출시했다. 설계부터 운영까지 혼자 맡고 있다.
라이브: reevl.co.kr
문제
기존 서비스는 단지를 찾게 해준다. Reevl은 시장의 상태를 비교하게 한다.
집을 살지, 팔지, 기다릴지 정하려는 사람에게 필요한 것은 단지 하나의 가격이 아니다. 그 가격이 지금 시장의 어디쯤인지다. 오르는 중인지 내리는 중인지, 옆 지역과 비교해 어떤지, 전세가율과 거래량이 어느 방향인지가 같이 읽혀야 판단이 된다.
기존 방식은 단지를 찾는 데서 끝났다. 검색과 필터로 단지에 도달하면 가격과 매물이 나온다. 그 숫자가 시장의 어디쯤인지는 사용자가 머릿속에서 맞춰야 했다. 지수, 등락, 지역 순위는 다른 화면과 다른 서비스에 흩어져 있었다.
그래서 가격 하나보다 지수, 등락, 지역 순위를 먼저 보이게 했다. 단지는 검색의 목적지가 아니라 시장 안의 한 종목으로 놓았다.
이 문제 정의는 사용자 인터뷰가 아니라 내가 세운 가정이다. 검증은 출시 뒤에 왔다. 어느 가정이 맞고 어느 가정이 틀렸는지는 행동 데이터와 사용자의 지적이 알려줬다.
핵심 결정
제품의 방향을 정한 결정 다섯 개다. 무엇을 정했고, 왜 그랬고, 무엇이 나왔는지 적었다.
집값이 아니라 시장의 상태를 보여준다
시장 전체가 어디로 움직이는지가 단지 하나의 가격보다 먼저 읽혀야 한다고 봤다. 블룸버그 터미널의 정보 밀도에 토스증권의 정돈된 화면을 얹었다.
홈 한 화면에서 시장 브리핑, 매매·전세 지수, 단지 랭킹을 함께 읽는다. 단지 검색은 그다음이다.홈 화면
리뷰가 아니라 세션 리플레이로 화면을 판정한다
8월 27일 기능 12종을 하루에 공개했다. 각 기능은 리뷰를 통과했는데 화면이 무너졌다. 이탈률이 24%에서 62%로 올랐고, 체류 시간은 226초에서 40초로 떨어졌다. RageClick 36건은 관측 기간 중 이날에만 나왔다.
세션 리플레이에서 원인 6개를 찾아 고쳤다. 8월 29일 RageClick 0건, 9월 1일 이탈률 29%, 체류 115초로 돌아왔다.사용 지표
2년 이상의 예측 금액은 보여주지 않는다
2년 이상은 단지 단위 IC가 0.01이다. 사실상 맞히지 못하는 숫자다. 1년 전망은 순위 적중도(IC) 0.19로 분기의 93%에서 양수였다.
장기 예측은 금액을 내지 않는다. 워크포워드 검증을 통과한 지역 단위(IC 0.16)로만 보여준다.
Figma를 코드에서 다시 만든다
실제 코드의 토큰에서 Figma 라이브러리를 역으로 뽑았다. 디자이너가 보는 값과 사용자가 받는 값이 달라지면 안 됐다.
변수 140개 · 스타일 28개 · 컴포넌트 23개 (v1.0, 2026.09.17). 채택률은 매 빌드마다 측정한다. 색 98.5% · 타이포 100% · z층 95.2% (ds_scan 실측).디자인 시스템
AI에게는 값보다 단위와 의미를 먼저 준다
read-only 툴 7개로 MCP 서버를 열었더니 모델이 만 원 단위 시세를 원으로 읽었다. 1만 배 오차가 났다. 사람은 이상하면 되묻지만 모델은 묻지 않고 지어낸다.
describe_fields 툴을 만들었다. 모델은 값을 읽기 전에 단위와 의미를 먼저 받는다.
나머지 결정
- 모든 화면에서 상승은 빨강, 하락은 파랑 – 한국 시장 사용자에게 익숙한 관습을 그대로 따랐다. 초록은 상승의 뜻으로 쓰지 않는다. 등락 색은 디자인 시스템 토큰(up · down)으로만 쓴다.
- 한 화면, 세 가지 껍데기 – 같은 정보를 PC에서는 도크 패널로, 폰에서는 전체 화면으로, 검색 유입에는 독립 페이지로 보여준다. 같은 구조에서 공개 페이지 64,817개가 나왔다.
- 없는 값은 0이 아니라 '해당 없음'으로 비운다 – 고속도로가 없는 제주 · 울릉의 1,047개 단지를 0으로 채우면 교통이 나쁜 곳으로 읽힌다. 검증 구간을 옮기자 부호가 뒤집힌 지표도 같은 이유로 뺐다. 역세권을 기준선에 두고 고속도로와 공항을 더했다.
- 학군 점수에서 진학률을 뺐다 – 학교알리미 진학률은 변별력이 없었고, 점수에 넣으면 학교를 서열화하는 신호가 됐다. 대신 NEIS 학원가 밀집도를 썼다. 데이터가 있다고 다 쓰지 않았다.
- 자연어 검색은 LLM 없이 만들었다 – 검색창과 AI 캔버스가 파서 하나(nlsearch.ts)를 공유한다. "서초구 2호선 역세권 20억 이하"가 그대로 스크리너 조건이 된다. 비용과 지연과 불확실성을 한 번에 피했다.
과정
리서치
리서치는 인터뷰가 아니라 운영 데이터와 사용자의 지적에서 나왔다. 출시 후 매일 들어오는 신호가 다음 결정의 근거였다.
- 사용자 지적에서 시작된 커밋 366건 – 전체의 16%다(산출물). 한 문장짜리 지적이 그대로 수정으로 이어졌다. "호버 효과가 잘려요"(원인이 세 번 바뀐 문제), "뒤로 가면 아파트 목록으로 돌아가 버려요" 같은 말이다.
- 행동 데이터 – 유입의 89%가 네이버, 기기의 79%가 모바일이었다(Clarity 실측, 2026년 9월 6일 기준). 이 두 숫자가 우선순위를 정했다. 모바일 먼저, 네이버 검색 먼저.
- 데이터 출처 8곳 – 국토부 실거래, K-apt, 한국부동산원, KOSIS, 한국은행, V-World, 학교알리미, 청약홈. 255개 시군구, 전국 아파트 45,695단지, 누적 실거래 1,100만 건을 한 화면의 언어로 맞췄다(산출물).
디자인
정보 구조
같은 화면이 세 가지 껍데기로 나온다. PC는 도크 패널, 폰은 전체 화면, 검색 유입은 독립 라우트다.
디자인 시스템
Figma 라이브러리를 실제 코드에서 역으로 뽑아 다시 만들었다. 토큰의 원본은 배포된 제품이고, 얼마나 지켜지는지는 매 빌드마다 측정한다.
개발
빌드 로그
커밋에서 고른 마일스톤이다. 하나하나가 실제로 배포된 결정이다.
엔진과 프론트엔드를 한 번에
데이터 엔진과 Next.js · Tailwind 프론트엔드로 '부동산 해석 터미널'의 뼈대를 세웠다.
로고와 아이덴티티
워드마크 · 마크 · 모바일 로고를 헤더와 푸터에 적용.
공용 컴포넌트로 묶기
Badge · Popover · StatRow 프리미티브와 간격 리듬 · 상태 토큰을 만들어 화면마다 다르던 위계를 통일.
자연어 검색 재설계
단지 이름과 조건을 분리해 읽고, 개념 사전으로 스크리너의 모든 조건을 말로 걸 수 있게 했다.
GA4 · Clarity 도입
실사용 데이터를 보기 시작한 지점.
배포 검증 게이트
배포 후 청크 404를 자동으로 감지하고 재배포한다.
리블 AI를 별도 앱으로
탐색(리블)과 대화(리블 AI)의 멘탈 모델이 달라 /ai 독립 셸로 분리.
첫 화면이 7.8MB를 기다리지 않게
느린 모바일에서 홈 표가 무한 로딩되던 문제를 경량본 구조로 근본 해결.
코드에서 Figma로
코드에서 추출한 140개 변수와 23개 컴포넌트로 Figma 디자인 시스템을 구축.
활동
수요와 공급으로 부동산을 재정의
- TypeScript50.4%
- Python41.5%
- JavaScript4.5%
- CSS2.2%
- Shell1.4%
커밋 2,380개 중 2,054개를 Claude Code와 함께 작성
2026년 7월 1일 이후 커밋 2,380개
| 7월 | 8월 | 9월 | ||||||||||
| 월 | ||||||||||||
| 수 | ||||||||||||
| 금 | ||||||||||||
2026년 9월 17일 커밋
- 9d2f5a2
docs(디자인): Figma 디자인 시스템 구축 기록 – 코드에서 추출한 140토큰·23컴포넌트
exclusiveyon-a11y committed
- 82b17e0
chore(통근): 지하철 그래프 공식 경로시간 대조 스크립트·참값 캐시(296+111쌍)
exclusiveyon-a11y committed
- 54fab7e
fix(통근): 신분당·수인분당·공항철도·부산·대구 등 34개 노선을 좌표 근사에서 열차 시간표 실측으로
exclusiveyon-a11y committed
- aaf1caf
fix(통근): 서울 버스가 대전 정류장으로 순간이동했다 – 정류장 ID가 전국 유일이 아니었다
exclusiveyon-a11y committed
2026년 9월 16일 커밋
- 585953a
fix(통근): 강남→서면(부산) 55분 – 동명이역이 순간이동으로 이어져 있었다 · 버스+지하철 통근 신설
exclusiveyon-a11y committed
- 1feb7c8
fix(도보): '역 도보 N분'이 실제보다 중위 3분 짧았다 – 보행망 실경로 + 오르막
exclusiveyon-a11y committed
도크 버그 전수조사
도크를 여는 경로는 표만이 아니라 히트맵 · 비교 · 검색 · 딥링크에도 있었다. 유형 판정 로직이 이 경로와 어긋나 정체성 버그 7건이 났다. 같은 종류를 한 번에 훑어 7건을 함께 고쳤다. 코드 주석에는 같은 계열이 이미 두 번 적혀 있었다.
스택과 구현 세부
프론트는 Next.js · TypeScript · Tailwind, 시계열 차트는 TradingView Lightweight Charts. 뒤에는 Python 데이터 엔진. 호스팅은 Cloudflare Workers와 D1 · R2다. 7월 25일 Vercel에서 옮겼다. 단지 상세 4.5만 장이 요청마다 서버에서 렌더되고 있어 정적 생성으로 바꿨고, 되돌릴 경로는 남겨 뒀다.
접근성 작업은 커밋 35건이다. 툴팁 ARIA, 다이얼로그 포커스 트랩, sr-only 라벨을 넣었고, 법적 문서의 판본 선택기는 네이티브 select 위에 얹어 접근성을 지켰다.
빌드 게이트는 11종이다. 디자인 시스템 채택률(ds_scan)과 첫 화면 JS 예산 432KB가 여기 들어 있다. 하나라도 실패하면 배포되지 않는다. 규칙은 실제로 사고가 난 것만 넣는다. 이론상 나쁜 패턴까지 넣으면 경고가 쌓이고, 쌓인 경고는 곧 무시당한다.
같은 데이터를 공개 MCP 서버로도 열었다. AI 도구가 한국 아파트 데이터를 직접 조회한다. MCP 서버는 공식 레지스트리에도 올랐다. ChatGPT 앱 디렉터리와 Claude Code 플러그인 마켓플레이스에도 열었다. 이후 채널을 MCP 하나로 정리했다.
결과
제품을 가장 크게 바꾼 것은 새 기능이 아니라 실패한 배포였다. 아래 숫자는 GA4와 Microsoft Clarity 실측이다.
- 24% → 62%
- 6개
- 62% → 29%
- 36 → 0
- 98 → 18
- 36초 → 115초
8월 27일 사고의 원인 6개
조건 줄이 헤더에 붙지 않고 중간에 떠 있던 원인은 투명도와 헤더 높이 두 가지였다. 고정된 단지명 칸이 행을 다 덮지 못해 뒤 열이 비쳐 보였다. 지나간 행에 잔상이 남은 이유는 블러를 가진 자식 요소에 bar-blur가 빠져서였다. 좁은 화면에서는 단지명이 사라지고 배지와 범위가 겹쳤다. JSX 주석을 중괄호 없이 넣어 주석이 그대로 글자로 렌더되고 있었다. 청약 유형 표는 상태값 누락과 예정단지 필터 때문에 행이 0개로 나왔다.
규모
- 7,000+
- 64,817
- 45,695
데이터 범위는 공공 출처 8곳, 255개 시군구, 누적 실거래 1,100만 건이다(산출물). 리블은 국내 UI/UX 레퍼런스 플랫폼 유아이볼에 소개됐다.
유입 경로
"국내 부동산 검색은 네이버가 시장"이라는 가정이 숫자로 확인됐다. GA4와 Clarity 실측, 2026년 9월 6일 기준이다.
- 1,122
- 912
- 42
채널별 세션과 검색 노출
GA4 채널: Organic Search 1,199 · Direct 656 · Organic Social 82 · Unassigned 66 · AI Assistant 42 · Referral 16.
사이트맵에는 URL 65,501개가 올라가 있다. 구글 크롤이 하루 29,514건에서 22건으로 급감한 사고가 있었다. 원인은 상세 페이지의 서버 렌더링이었다. 고친 뒤에도 구글 노출은 아직 회복 중이다.
Search Console 실측으로는 평균 순위가 2~5위권을 유지했고 최고 1.2위(8월 24일, 클릭 3건)를 기록했다. 노출 66회에 클릭 4회로 수가 적었다. 색인된 페이지가 적을 뿐 순위 자체는 낮지 않았다.
사이트맵을 41,600개에서 65,501개로 키운 뒤 청구서가 따라왔다. Worker CPU가 평소 2~5M ms에서 13.5M ms로 뛰었고, 5xx 831건이 났다. SEO 도구의 크롤러 하나는 9시간 20분 동안 CPU 1,000만 ms를 썼다. 검색엔진이 아니어서 색인에는 기여하지 않았다. robots.txt와 WAF로 막았다.
AI 크롤러는 막지 않고 속도만 늦췄다. 23시간 측정에서 GPTBot 34,856건(28%), ClaudeBot 25,161건(21%)이 찍혔다. 같은 시간 Googlebot은 480건이었다. 차단 대신 crawl-delay를 걸어 AI가 인용할 길은 남겼다. AI 어시스턴트 유입 42건이 그 결과다.
사람이 개입하는 지점
운영은 자동으로 돈다. 판단이 필요한 자리만 사람에게 온다.
- 자동 – 실거래가 갱신, 발행, 오류 감시를 n8n 워크플로우로 돌린다. 매일 열어 보는 창이 아니라 문제가 있을 때만 알리는 구조다.
- 사람 – 출처가 불안정한 데이터는 자동화 대신 손으로 갱신한다. 화면에는 데이터 기준일을 함께 적는다. 틀린 값을 자동으로 보여 주기보다 언제 값인지 밝히는 편이 낫다.
- 상한 – 발송 총량을 하루 50건으로 묶었다. 알림이 하루 50번 울리면 그 채널은 음소거된다. 음소거된 채널은 0건과 같다.
회고
맞았던 것
- Figma를 코드에서 역추출한 결정 – 디자이너가 보는 값과 사용자가 받는 값이 어긋나지 않았다. 지켜지는 정도를 매 빌드마다 측정한다. 색 98.5% · 타이포 100% · z층 95.2%(ds_scan 실측).
- 모바일 먼저, 네이버 먼저 – 유입 89%가 네이버, 기기 79%가 모바일이었다(Clarity 실측, 9월 6일 기준). 출시 전에 세운 우선순위가 그대로 맞았다.
- 검증되지 않는 숫자를 지우는 판단 – 2년 이상의 단지 단위 예측 금액을 뺐다. 화면에 남은 것은 워크포워드 검증을 통과한 지역 단위뿐이다. 정확해 보이는 화면보다 틀리지 않는 화면이 낫다고 지금도 본다.
틀렸던 것
- 리뷰를 통과한 화면은 괜찮다고 봤다. 8월 27일이 그 가정을 반박했다. 기능 12종은 각각 맞았고, 한 화면에 함께 놓인 결과가 틀렸다.
- 좋아 보이는 검증 성적을 먼저 의심하지 않았다. 라벨 계산에 미래 정보가 새어 들어가 IC가 두 배로 부풀어 있었다. FEATURE_LAG=2로 고쳤다. 모델 업그레이드 5종도 실측 뒤 4종을 기각했다.
- 파이프라인의 초록불을 믿었다. 오케스트레이터 노드가 실패해도 워크플로는 성공으로 끝나고 있었다. 네이버 블로그 발행이 6주 멈춰 있었고, 서버 에러 11,891건이 0건으로 보고됐다. 그 뒤로 성공 로그가 아니라 결과물을 감시한다. 운영 점검 20가지를 자동화했다.
- 검색 노출을 늘리는 비용을 계산하지 않았다. 공개 페이지를 늘리자 크롤러가 인프라 청구서를 만들었다. 지표가 제품에 실제로 중요한지 먼저 묻게 됐다.
다음에 확인할 것
- QuickbackClick 19.6% – 들어왔다 바로 돌아가는 세션이 어디서 끊기는지 아직 모른다(Clarity 실측, 9월 6일 기준).
- 구글 노출 – 상세 페이지 렌더링을 고친 뒤에도 아직 회복 중이다.
- 협업 – 혼자 만든 제품이라 팀에서도 같은 판단이 통하는지 보여줄 재료가 없다.
다음 – ON THE WAY
가는 길을 탐색으로 바꾸는 졸업 전시 「REEVL: ON THE WAY」를 기획하고 있다. 임장은 목적지에 도착해야 시작됐다. 하지만 가는 길에 지나치는 동네와 도로도 이미 그 지역이다. 임장을 9단계로 나눠 재 보니 14.3시간 중 절반이 이동과 정리에 쓰였다. 리블의 실거래와 지표 데이터를 차량 맥락에 맞게 다시 설계한다. 지나가는 장소에 시세가 붙고, 물으면 답 대신 경로가 바뀐다.
화면을 그리기 전에 올릴 수 있는지를 먼저 확인했다. AAOS 기반 Pleos Connect의 제약을 검토한 기록은 리블: ON THE WAY에 따로 정리했다.