← 목록
기타 2026-05-22 16KB 읽기 17분

Crowny Finance v1.1 — 렌탈 메인 + 통합 접수

개요

finance.crowny.org (9753 프록시 / 9750 한선씨) 를 크라우니금융서비스 통합 진입점으로 고도화. 메인 메뉴를 뱅크 · DEX · 렌탈 · 네트워크 4구조로 재편하고, 렌탈을 첫 메인 서비스로 노출. 운영사: 주식회사엔에스렌탈서비스.

무엇을 했나

  1. 메인 메뉴 4탭 헤더 (web/index.html)
- 뱅크 / DEX / 렌탈(기본 활성) / 네트워크 - 우측 운영사 배지: 주식회사엔에스렌탈서비스
  1. 렌탈 페이지 (메인) — hero + 카탈로그 + 최근 접수
- 3개 그룹: 렌탈 / 크라우니솔루션 / 크라우니집사 - 각 9종 패키지 카드 + 즉시 접수 버튼
  1. 통합 접수 모달 — 이름·연락처(필수) + 이메일·메모, source/category 자동 바인딩
  2. 렌탈 토탈 DB (src/크라우니파이낸스.한선)
- 접수번호 자동증가, _rcv{n}_* 평면 키 - 소스 필터(rental/solution/butler) + 전체통계
  1. 카탈로그 API: /api/catalog — 9 패키지 정의를 한선씨 서버에서 직접 제공

API

메소드경로설명
GET/api/catalog9 패키지 카탈로그
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/statusv1.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차 — 소넷/하이쿠 서브에이전트 병렬)

#이슈처리
1URL 퍼센트 디코딩헥스값() + URL디코드() 추가, 경로() 반환 직전 적용. /api/%63atalog/api/catalog 검증, 영문 라우트 무손상
2접수 상태 변경 API접수상태변경(id,상태) + POST /api/rental/update. 접수/배정/완료/취소 4상태, 잘못된 상태·미존재 id 거부. 목록에 상태 <select> UI
3카탈로그 외부 분리data/catalog.json 생성, 카탈로그JSON()읽기()로 로드, 실패 시 폴백 JSON
4gateway.yaml 등록이미 완전 등록됨(라인 3103–3133), 포트 레지스트리 9753 정상 — 작업 불필요

추가 API

메소드경로설명
POST/api/rental/update접수 상태 변경 {id, status} → 변경된 접수 객체 반환

추가/수정 파일

  • data/catalog.json — 신규, 9패키지 카탈로그
  • src/크라우니파이낸스.한선 — 헥스값·URL디코드·접수상태변경 함수 + update 라우트
  • web/assets/app.jschangeStatus() + 목록 상태 <select>
  • web/assets/style.css.rl-status-sel

2차 E2E 검증 (전부 통과)

  • catalog 외부파일 로드 정상 / receive 정상
  • update id=1→배정 반영 확인 / 잘못된 상태 invalid status 거부 / 미존재 id not 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()(localStorage nsOperatorToken, 없으면 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패스 실행
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서버.han 9753 LISTEN — 별도 도메인 할당 필요(예: stock.crowny.org)
  • 메모리 신규: feedback_session_layer_split.md (전 세션 공유 규칙)

포트 재배치 (충돌 해소)

대상이전이후비고
finance 프록시97539754사용자 서비스, gateway.yaml SSOT 갱신
finance 백엔드97509750유지
시즌1 백엔드97539753유지 (개발서버, 도메인 회수)
메일브리지 → finance97539754파이낸스포트 변수 갱신 후 재컴파일

변경 파일

  • crowny-finance/proxy.jsPROXY_PORT = 9754
  • crowny-finance/src/메일브리지.한선파이낸스포트 = 9754
  • crowny-gateway/gateway.yamlfinance.crowny.org upstream 9754 (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-findev upstream :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 검토