← 목록
기타 2026-07-26 5KB 읽기 5분

crowny-cloudpick 서버측 3본 (에이전트A분)

개요

cloudpick.crowny.org:9623 — 11개 클라우드 비교·목적별 4상 추천·내 서비스 관리 서비스의 서버측 3파일(데이터·추천엔진·서버)을 스펙.md SSOT 그대로 구현. crowny-vps/서버.한선을 베이스 패턴으로 재사용(인증·PSV·회수 이디엄).

무엇을 했는지

  1. data/클라우드데이터.psv — 스펙 §프로바이더 데이터 표 11행을 그대로 PSV화(헤더 주석 1줄 + 11행 10필드, 값 수정·창작 없음). 검증: awk 필드수 전부 10, CR 0, 중복코드 0.
  2. 추천엔진.한선추천계산(목적태그, 예산월원, 한국리전필수, 무료우선) 4상 규칙(티/옴/타/음) 구현. 데이터는 PSV에서 매 호출 로드(하드코딩 없음 — 유효 목적태그 집합도 PSV 용도태그 합집합에서 도출, 데이터 수정 시 엔진 무수정). top-level 기동문 없음(순수 라이브러리). 정렬: 티=최저가순, 옴=사유 글자수 적은 순, 버블정렬(11건 소규모라 O(n²) 무리 없음).
  3. 서버.한선 — 스펙 §API 계약 9개 엔드포인트 전부 구현(GET /, /api/health, /api/providers, POST /api/recommend, /api/auth/register, /api/auth/login, POST/GET /api/my/*). crowny-vps 서버.한선의 PSV/토큰/응답 헬퍼를 그대로 재사용. 가져오기 "추천엔진.한선"(같은 디렉토리 상대경로 해석).

게이트별 실측

  1. 컴파일: CROWNY_STRICT=1 ./hanseonc_high 서버.한선 > 서버.toau exit 0, [STRICT] 경고 0줄(stderr에 가져오기/토큰/큐브 로그만).
  2. 추천엔진 단독 4상 검증(별도 테스트 .한선, 5/5 통과):
- 티: 추천계산("무료시작",0,0,1) → oracle 티(사유 없음, 정렬 1위) - 옴: 추천계산("웹서버",0,1,0) → hetzner 옴, 사유="한국리전 없음" - 타: 같은 결과에서 ncloud 타, 사유="용도 불일치" - 음: 추천계산("존재안하는목적태그",0,0,0) → 11개 전부 음, 사유="목적 미등록 — 크라우니에 문의"
  1. 종단 스모크(PORT=19623 임시): health(providers:11) → providers 11개 확인 → recommend 3케이스(티/옴+타/전체음) → register(smoketest1) → login → my/add(oracle, svc_id=s1) → my/update(상태 사용중) → my/list 반영 확인 → 프로세스 kill+재기동 → my/list 잔존 확인(PSV 복원 정상) → 재종료, 포트/프로세스 잔존 0 확인.
  2. 라이브 :9623 배선·LaunchAgent는 담당 밖(오너가 별도 진행).

스모크가 남긴 테스트 데이터 (그대로 둠)

  • data/계정.psv: smoketest1 계정 1건
  • data/세션.psv: 세션 토큰 1건 (86400초 후 자연 만료)
  • data/내서비스.psv: s1(oracle, "스모크서버1") 2행 — 최초 등록(검토중)+상태변경(사용중) append

관련 파일

  • /Users/ef/crowny-cloudpick/스펙.md (SSOT)
  • /Users/ef/crowny-cloudpick/data/클라우드데이터.psv
  • /Users/ef/crowny-cloudpick/추천엔진.한선
  • /Users/ef/crowny-cloudpick/서버.한선 / 서버.toau
  • 베이스 참조: /Users/ef/crowny-vps/서버.한선

발견한 함정 / 설계 판단 메모

  • 설정(배열,i,v)는 지역 배열에서 배열 = 설정(배열,i,v) 형태로 안전하게 재사용 가능(2D렌더러.한선 등 기존 라이브러리 패턴과 일치, 전역 append-only 규칙과는 별개).
  • 추천엔진 4상 규칙 해석: 스펙의 "무료우선=1이면 무료티어 있는 곳 가점"은 하드 게이트가 아니라 "가점"으로 명시돼 있어 티/옴/타 판정에는 관여시키지 않고(한국리전필수·예산만 하드 제약), 데이터 필드로만 응답에 실어둠 — UI에서 추가 가점 정렬에 활용 가능하도록 열어둠.
  • 매치=1이지만 제약 위반이 있는 행은 "옴", 매치=0인 행은 위반 여부와 무관하게 "타"로 귀속(스펙이 "타=불일치+위반"이라 했지만 위반 없이 단순 불일치인 경우도 명확히 부적합으로 분류하는 편이 API 일관성에 낫다고 판단). 단 매치=0이면서 동시에 제약도 위반이면 사유 문자열에 그 제약 사유("한국리전 없음" 등)가 "용도 불일치" 대신 노출됨(사유가 이미 채워져 있으면 덮어쓰지 않음) — 필요시 후속 세션에서 "용도 불일치"를 항상 우선 노출하도록 조정 가능.
  • 프로바이더 목록 JSON 필드명(code/name/hq/krRegion/minPriceUsd/freeTier/strength/weakness/tags/signupUrl)은 스펙에 명시 안 돼 있어 에이전트A가 임의 명명 — 에이전트B(index.html/앱.한선) 작업 시 이 키로 맞춰야 함.

잔여 이슈

  • public/index.html, 앱.한선은 에이전트B 담당(미착수) — 지금은 GET / 요청 시 503 "index.html 준비 중" 정상 폴백.
  • 라이브 :9623 게이트웨이 연동·LaunchAgent 등록은 오너 진행 예정(본 세션 범위 밖).