Crowny Finance v1.1 — 렌탈 메인 + 통합 접수
개요
finance.crowny.org (9753 프록시 / 9750 한선씨) 를 크라우니금융서비스 통합 진입점으로 고도화.
메인 메뉴를 뱅크 · DEX · 렌탈 · 네트워크 4구조로 재편하고, 렌탈을 첫 메인 서비스로 노출.
운영사: 주식회사엔에스렌탈서비스.무엇을 했나
- 메인 메뉴 4탭 헤더 (
web/index.html)
- 렌탈 페이지 (메인) — hero + 카탈로그 + 최근 접수
- 통합 접수 모달 — 이름·연락처(필수) + 이메일·메모, source/category 자동 바인딩
- 렌탈 토탈 DB (
src/크라우니파이낸스.한선)
_rcv{n}_* 평면 키
- 소스 필터(rental/solution/butler) + 전체통계
- 카탈로그 API:
/api/catalog— 9 패키지 정의를 한선씨 서버에서 직접 제공
API
| 메소드 | 경로 | 설명 |
|---|---|---|
| GET | /api/catalog | 9 패키지 카탈로그 |
| POST | /api/rental/receive | 통합 접수 (source/category/name/phone/email/memo) |
| GET | /api/rental/list | 전체 접수 (최신순) |
| GET | /api/rental/list/{rental,solution,butler} | 소스 필터 |
| GET | /api/rental/stats | 통계 (total/rental/solution/butler/operator) |
| GET | /api/status | v1.1.0, receipts 카운트 포함 |
관련 파일
/Users/ef/crowny-finance/src/크라우니파이낸스.한선— 백엔드 (한선씨)/Users/ef/crowny-finance/web/index.html— 4탭 SPA/Users/ef/crowny-finance/web/assets/app.js— 라우팅 + 접수 로직/Users/ef/crowny-finance/web/assets/style.css— 신규 스타일 append
E2E 검증
- 3건 접수(rental/solution/butler) 전부 #1/#2/#3로 정상 저장
/api/rental/stats={total:3, rental:1, solution:1, butler:1}확인- 소스 필터 정상 동작
잔여 이슈 처리 (2026-05-22 2차 — 소넷/하이쿠 서브에이전트 병렬)
| # | 이슈 | 처리 |
|---|---|---|
| 1 | URL 퍼센트 디코딩 | 헥스값() + URL디코드() 추가, 경로() 반환 직전 적용. /api/%63atalog→/api/catalog 검증, 영문 라우트 무손상 |
| 2 | 접수 상태 변경 API | 접수상태변경(id,상태) + POST /api/rental/update. 접수/배정/완료/취소 4상태, 잘못된 상태·미존재 id 거부. 목록에 상태 <select> UI |
| 3 | 카탈로그 외부 분리 | data/catalog.json 생성, 카탈로그JSON()이 읽기()로 로드, 실패 시 폴백 JSON |
| 4 | gateway.yaml 등록 | 이미 완전 등록됨(라인 3103–3133), 포트 레지스트리 9753 정상 — 작업 불필요 |
추가 API
| 메소드 | 경로 | 설명 |
|---|---|---|
| POST | /api/rental/update | 접수 상태 변경 {id, status} → 변경된 접수 객체 반환 |
추가/수정 파일
data/catalog.json— 신규, 9패키지 카탈로그src/크라우니파이낸스.한선— 헥스값·URL디코드·접수상태변경 함수 + update 라우트web/assets/app.js—changeStatus()+ 목록 상태<select>web/assets/style.css—.rl-status-sel
2차 E2E 검증 (전부 통과)
- catalog 외부파일 로드 정상 / receive 정상
- update id=1→배정 반영 확인 / 잘못된 상태
invalid status거부 / 미존재 idnot found거부 - URL디코드
%63처리 정상, 영문 라우트 무손상
함정
- 한선씨 함수명은 숫자로 시작 불가 →
16진값컴파일 실패,헥스값으로 변경.
3차 — 운영자 인증 + 데이터 영속화 (2026-05-22, v1.2.0)
데이터 영속화
data/receipts.dat— 파이프(|) 구분, 줄당 1건:id|src|cat|name|phone|email|memo|st|ts접수저장()— 접수등록·상태변경 시마다 전체 재기록.줄이스케이프()로|·개행 무해화접수로드()+접수로드한줄()+필드()— 서버 시작 시 복원,_접수수최대 id로 복원- 검증: 재시작 후
[load] 접수 2건 복원, 상태(배정)·신규 id 연속성 보존
운영자 토큰 인증
- 백엔드:
변수 운영자토큰 = "NS-RENTAL-2026",/api/rental/update가 본문token검사 → 불일치 시401 unauthorized - 프론트:
getOperatorToken()(localStoragensOperatorToken, 없으면 prompt) /clearOperatorToken()/resetOperatorToken().changeStatus()가 토큰 동봉, 401 시 토큰 폐기 후 재입력 유도 - 검증: 토큰 없음/오류 → 401, 정상 토큰 → 상태 변경 성공
함정
- 한선씨는 함수명 숫자 시작 불가 (
16진값→헥스값) - 동적 배열 인덱싱 회피 —
필드(줄,idx)스캔 함수로 파이프 파싱
4차 — 렌탈 워크플로우 고도화 (2026-05-22, v1.3.0)
소넷·하이쿠 서브에이전트 병렬 + /loop 자율 모드. 4개 모듈(M1~M4).
M1 택배식 6단계 진행추적
- 단계: 1 접수확인 → 2 상담배정 → 3 견적·계약 → 4 설치·배송 → 5 이용시작 → 6 유지보수
_rcv{n}_stage+_rcv{n}_p1..p6(단계별 타임스탬프) +_cancel- 영속화 17필드 확장:
...|stage|cancel|p1..p6 - API:
GET /api/rental/track/{id}(공개, 택배식 stages 배열),POST /api/rental/advance{id,stage,token},POST /api/rental/cancel,GET /api/rental/contact - 기존
/api/rental/update(4상태) 제거 → 6단계 모델로 대체
M2 안내메일 발송큐
- 접수 시 이메일 있으면 안내메일 자동 생성 →
data/mail-outbox.dat(마커 포맷, 발송자 rental@crowny.org) - 메일 내용: 업무 프로세스 6단계 + 박주훈 대표(010-4043-3821) 정보 + 현황조회 안내
POST /api/rental/mail/outbox(운영자) 통계. 실제 송출은 메일서버 구축 후 별도 발송기 과제
M3 메일 자동회신 + 음(O)영역 에스컬레이션
- 티옴타 3진 분류
메일분류(): T(+1 자동처리)/O(0 음=모름→담당자)/A(-1 거부) - T → 자동회신 메일 적재 / O →
data/mail-escalation.dat+ 박주훈 대표 알림메일 / A → 거부 - 키워드 미매칭 = 모름 = O → 담당자 에스컬레이션
- API:
POST /api/rental/mail/inbound{from,subject,body,token},POST /api/rental/mail/escalations(운영자)
M4 모바일 원스탑 추적 UI (소넷 에이전트)
- 렌탈 페이지에 "내 접수 조회" — 접수번호 입력 → 택배 배송조회식 세로 타임라인(6단계, done/current/pending)
- 담당자 카드(박주훈 대표, tel:/mailto: 링크), 운영자 6단계 advance 컨트롤 + 취소
- 모바일 우선 반응형
4차 E2E 검증 (전부 통과)
- 추적: advance 1→4 후 단계 4/완료 4단계, 재시작 후 단계 보존
- 메일: 이메일 접수→발송큐 적재, T=자동회신/O=에스컬레이션/A=거부 정확
- 영속화 3종(접수/메일큐/에스컬) 재시작 복원, 토큰 인증 일관
메일 인프라 현황 (중요)
SMTP.한선/IMAP.한선라이브러리 없음,mail.crowny.org:9610미가동, crowny.org MX 레코드 없음- 따라서 실제 외부 메일 송수신 불가 → 발송큐 + 분류로직으로 구축, 실제 송출/수신 연결은 메일서버 구축이 별도 과제
5차 — crowny-mail 실연동 (2026-05-23, v1.3.0)
이전 조사 보완: crowny-mail 실재(/Users/ef/crowny-mail, server.js + 크라우니메일서버.한선, mail.crowny.org:9610). 한선씨 HTTP 클라이언트로 양방향 연동 완성.
crowny-mail 계정 추가
rental@crowny.org/rental-2026-crowny(member) — server.js + 크라우니메일서버.한선 초기데이터 모두에 시드
메일브리지.한선 (한선씨 HTTP 클라이언트)
/Users/ef/crowny-finance/src/메일브리지.한선— 1패스 실행
로그인() → X-Session 토큰 획득
2. 디스패치() — mail-outbox.dat 파싱(===MAIL #N=== 마커), 디스패치 cursor 초과분만 /api/mail/send
3. 폴링() — /api/mail/inbox GET, 폴 cursor 초과분만 finance /api/rental/mail/inbound로 전달
- 한선씨 HTTP 클라이언트 핵심:
소켓생성(2,1)→소켓연결(소켓,host,port)→소켓받기(소켓, 65536) 바이트수(s)— UTF-8 byte count for Content-Length(한글 본문 정확 전송)- JSON 응답이 chunked transfer-encoding이어도
필드값()키 검색은 청크 마커를 자연 스킵
주기실행 래퍼
/Users/ef/crowny-finance/메일브리지실행.sh— 30초 간격(BRIDGE_INTERVAL환경변수)perl alarm기반 15초 타임아웃 (crowny-mail 다운 시 무한대기 방지)- 로그:
data/메일브리지.log
풀 사이클 검증 (E2E)
- 접수(이메일 포함) → 발송큐 → 브리지 → kim 수신함 도착 ✓
- kim → rental 메일(O 키워드: 해지/환불/고장) → 브리지 폴링 → finance 분류 → 에스컬레이션(박주훈 대표) + admin 알림 메일 ✓
- 3회차 사이클 — self-loop 0건/0건 (
보낸이 != 렌탈계정필터 + 알림 수신자를 admin@crowny.org로 분리) ✓
함정 / 운영 메모
- 한선씨
시도는 try 예약어 → 변수명 금지 (회차로 회피) 소켓받기는 크기 인자 필수 — no-arg 형은 동작 불안정- Node
res.end(JSON)는 단일 청크 —필드값()검색 가능 - crowny-mail 재시작 시 mailCounter 0으로 리셋 → 폴 cursor 잔존 시 새 메일 스킵 → 재시작 후
data/mail-poll-cursor.dat삭제 권장(자동 감지는 후속 개선) 에스컬레이션 알림은 admin@crowny.org로 분기(자기루프 차단)
신규/수정 파일
crowny-mail/server.js,crowny-mail/크라우니메일서버.한선— rental 계정 시드crowny-finance/src/크라우니파이낸스.한선— 에스컬레이션 수신자 admin으로 변경crowny-finance/src/메일브리지.한선— 신규(한선씨 HTTP 클라이언트)crowny-finance/메일브리지실행.sh— 신규 주기실행 래퍼
패턴 학습
fn_메일_HTTP클라이언트, fn_메일_UTF8바이트수 — 한선씨 HTTP 클라이언트 재사용 패턴6차 — 세션 레이어 구분 + 포트 재배치 (2026-05-27)
사용자 서비스 vs 개발서버 분리 (전 세션 적용)
- 사용자 서비스 finance.crowny.org: 렌탈/뱅크/DEX/네트워크 토탈 진입점 = 이 프로젝트
- 개발서버 시즌1 유통:
시즌1서버.han9753 LISTEN — 별도 도메인 할당 필요(예: stock.crowny.org) - 메모리 신규:
feedback_session_layer_split.md(전 세션 공유 규칙)
포트 재배치 (충돌 해소)
| 대상 | 이전 | 이후 | 비고 |
|---|---|---|---|
| finance 프록시 | 9753 | 9754 | 사용자 서비스, gateway.yaml SSOT 갱신 |
| finance 백엔드 | 9750 | 9750 | 유지 |
| 시즌1 백엔드 | 9753 | 9753 | 유지 (개발서버, 도메인 회수) |
| 메일브리지 → finance | 9753 | 9754 | 파이낸스포트 변수 갱신 후 재컴파일 |
변경 파일
crowny-finance/proxy.js—PROXY_PORT = 9754crowny-finance/src/메일브리지.한선—파이낸스포트 = 9754crowny-gateway/gateway.yaml—finance.crowny.org upstream9754 (crowny-ports.sh SSOT)~/.claude/knowledge/PORTS.md— 자동 갱신- 메모리:
feedback_session_layer_split.md,project_crowny_finance_season1.md([개발서버] 마커)
E2E 검증 (전부 통과)
- finance 9754 status v1.3.0 정상 (catalog/contact/4메뉴 OK)
- 9753 시즌1 정상 가동 (충돌 없음)
- 접수 → 발송큐 → 브리지 → kim 수신함 도착 ✓
- 택배식 6단계 추적 ✓
- 브리지 래퍼 30초 주기 가동
운용 노트
- 다음 세션 시작 시
feedback_session_layer_split.md메모리를 통해 레이어 자동 인식 - 9754 점거 시 같은 패턴(메모리 + crowny-ports.sh set + 브리지 변수 갱신)으로 재배치
7차 — findev.crowny.org 분리 (2026-05-27)
시즌1 유통(개발서버)을 별도 서브도메인 findev.crowny.org로 노출 결정.
구조
사용자 게이트웨이 프록시 백엔드
finance.crowny.org ──→ :8443 ──→ :9754 (Node) ──→ :9750 (한선씨 finance)
findev.crowny.org ──→ :8443 ──→ :9755 (Node) ──→ :9753 (한선씨 시즌1)
핵심 함정 발견
- 시즌1서버.한선이 HTTP/1.0 응답 (한선씨 소켓 raw 출력) → Node http.get이
Parse Error: Missing expected CR after response line실패 - 게이트웨이의 trident 헬스체크가 Node http.get을 쓰므로 100% 실패 → Ta 판정 → 503
- 해결: 시즌1 앞단에 finance와 동일한 Node 프록시 패턴 적용
신규 컴포넌트
/Users/ef/crowny-findev/proxy.js— HTTP/1.0→1.1 변환 프록시 (raw 소켓 + Buffer 헤더 분리 + Hop-by-hop 제거)- gateway.yaml
crowny-findevupstream :9755, X-Crowny-Layer: dev, X-Robots-Tag: noindex
게이트웨이 운영 메모
/reload(config-reload)는 services Map만 갱신 — health checker의 svc 참조는 그대로 → upstream 변경 시 게이트웨이 재시작 필요- HTTP/1.0 백엔드는 게이트웨이 직결 불가, 반드시 HTTP/1.1 프록시 경유
E2E 검증 (전부 통과)
- findev.crowny.org/api/status → 시즌1 데이터 (누적유통/단계/만기) ✓
- findev.crowny.org/ → "크라우니 시즌1 유통" HTML UI ✓
- 헬스 Ti(건강) ✓ / 헤더 X-Crowny-Layer: dev + noindex ✓
- finance.crowny.org 무영향 (Ti, 1ms 응답) ✓
패턴 학습
fn_프록시_HTTP10_to_11_변환— 한선씨 백엔드(HTTP/1.0)를 게이트웨이가 다룰 수 있는 1.1로 변환하는 Node 프록시 패턴- broadcast 셀 #6826 — findev 가동 완료 + HTTP/1.0 직결 불가 사실
8차 — 사용자 서비스 5번째 메뉴 "유통" 통합 (2026-05-27)
finance.crowny.org에 5번째 메뉴 "유통" 추가, 시즌1 KPI를 사용자 서비스 진입점에서 노출.
5번째 탭 구성 (web/index.html, app.js, style.css)
- 메인 nav: 뱅크 · DEX · 렌탈 · 네트워크 · 유통
- KPI 1행 4개: 누적 유통 / 현재 단가 / 단계 / 만기(D-day)
- KPI 2행 4개: 총 물량(선언) / 총 대여풀 9인 / 이자 0% / 레이어 표기(개발서버)
- findev.crowny.org 상세 링크
- 데이터 fetch: localhost는 :9755, 운영은 https://findev.crowny.org (CORS *)
- 60초 폴링
시도된 한선씨 백엔드 통합 (보류)
시즌1호출(경로)+시즌1요약JSON()함수 작성 — 한선씨 HTTP 클라이언트로 9755 호출- 독립 한선씨 스크립트에서는 정상 동작 (메일브리지와 동일 패턴)
- 그러나 finance 서버 안에서 호출하면 응답 못 받음 (한선씨 서버 컨텍스트의 inner-socket 안정성 이슈)
- 변수명 그림자 격리(
소켓→sock1등)도 미해결 - 라우트
/api/circulation/summary는 미연결 상태로 두고, 함수 코드는 보존(추후 한선씨 inner-socket 안정화 후 재활성)
운영 결정
사용자 의도("구현 잘 되고 코드 변형하기 좋으면 됨")에 맞춰 프론트 직접 호출로 빠르게 가치 전달. 한선씨 변환 용이성은 보존 — fetch 패턴 단순, 백엔드 함수 자산 보존.E2E 검증
- finance 홈에 5번째 메뉴 정상 렌더링 (curl로 HTML 노출 확인)
- 9755 시즌1 3개 엔드포인트(status/price/declaration) 한글 키 JSON 응답 일관
- HTTPS 8443 SNI 통한 finance/findev 모두 정상
함정 메모
- 한선씨 서버 컨텍스트에서 새 outbound socket 시도 시 응답이 누락. 메일브리지(단일 패스 스크립트)에서는 정상 — 서버 메인 루프와 inner-socket 동시성 이슈로 추정. 후속 조사 필요.
남은 개선 여지
- 한선씨 서버 컨텍스트의 inner-socket 안정화 →
/api/circulation/summary백엔드 라우트 활성 → 캐시 가능 - 시즌1서버.한선 자체 HTTP/1.1 업그레이드 → 9755 Node 프록시 제거 가능 (시즌1 세션 작업)
- findev에 인증 게이트(개발자/관리자 영역 격리) — 현재 noindex 헤더만
- 메일서버(SMTP 발송 + IMAP 수신 + MX 레코드) 구축 → 발송큐를 실제 송출에 연결
/api/rental/mail/inbound를 실제 rental@crowny.org 수신과 연동- 운영자 토큰이 소스 상수 — 환경변수/암호화 저장 권장
- 에스컬레이션 처리완료(close) API, outbox/escalation 목록 상세조회 API
접수저장()전체 재기록 — 접수량 급증 시 append 검토