ABTI 한선씨 서버 자립 구동 검증 + 데이터 손상 사건
개요
ABTI 서버.한선(1238줄)이 Node.js 없이 단독으로 14개 API 엔드포인트를 처리하는지 검증. 검증 성공 — 그러나 검증 과정에서 운영 데이터 손상 사건 발생. 양쪽(성과 + 사고)을 정직하게 기록한다.
성과 — 한선씨 서버 14 엔드포인트 전부 동작
포트만 19811로 바꾼 복사본으로 검증. 결과:
| 엔드포인트 | 결과 |
|---|---|
| GET / (HTML) | ✅ |
| GET /api/stats | ✅ |
| GET /api/i18n/:lang | ✅ |
| GET /api/og/:typeCode (SVG) | ✅ |
| POST /api/profile | ✅ |
| GET /api/profile/:code | ✅ |
| PATCH /api/profile/:code | ✅ |
| GET /api/refer/:code | ✅ |
| POST /api/admin/login | ✅ |
| POST /api/admin/logout | ✅ |
| GET /api/admin/requests | ✅ |
| POST /api/admin/requests (세션인증) | ✅ |
| PATCH /api/admin/requests | ✅ |
| DELETE /api/admin/requests | ✅ |
수정한 버그 (3종)
1. TCP읽기 인자 부족
TCP_READ opcode 493은 [fd, 최대바이트] 2인자 필요. ABTI는 TCP읽기(클라이언트) 1인자 → 빈 문자열 반환 → 모든 요청 무응답.
- 수정:
TCP읽기(클라이언트, 8191)— 서버.한선 + libs/ABTI서버.한선
2. JSON.한선 API 불일치 (전면)
JSON.한선의JSON파싱은 [키,값,키,값,...] 배열을 반환. JSON생성도 이 배열만 직렬화 — 한선씨 해시맵(맵생성)은 []로 깨짐.
서버.한선은 전체가 "JSON객체 = 한선씨 해시맵" 전제로 작성 → 모든 응답이 []로 직렬화되고 있었음.
- 수정:
맵생성()→[](50곳),맵넣어(→JSON설정((154곳),맵꺼내(→JSON값((67곳) - 중첩 객체(scores) 이중파싱 제거,
글자수→길이배열 대응
3. JSON.한선 _맵인가 오판 (라이브러리 버그)
_맵인가가 "첫 원소 문자열변환 글자수>0"로 판단 → 객체 배열·숫자 배열을 맵으로 오판.
객체 배열 [{...},{...}]을 {"키":...} 객체로 잘못 직렬화 → requests.json 구조 손상.
- 수정:
타입(값[0]) == "string"엄격 검사 (crownyc/libs/JSON.한선)
4. 무작위() 정수 범위
무작위()는 0~1 float가 아니라 큰 정수(~1100~23500) 반환. 반올림(무작위()*15)가 범위 밖 인덱스 → 토큰/ID 빈 문자열.
- 수정:
무작위정수(n)헬퍼 추가 (절댓값 + 모듈로)
데이터 손상 사건 (사고 — 재발 방지용 기록)
무슨 일이
검증용 19811 복사본이 데이터 경로를 절대경로(/Users/ef/crowny-abti/data/*.json)로 그대로 들고 있어, 테스트 서버가 실제 운영 데이터를 직접 덮어씀.| 파일 | 피해 | 복구 |
|---|---|---|
| requests.json | 객체로 손상 + 2건 유실 | ✅ 복구 (조회 응답에 원본 5건 보존) |
| profiles.json | 원본 프로필 2개 유실 | ❌ 복구 불가 |
근본 원인 — 프로토콜 미준수
- crowny-hub 커밋 부재 — crowny-abti는 hub에 커밋 이력 0. 직전 스냅샷이 없어 복구 불가.
- 테스트 격리 부재 — 검증 빌드가 실데이터를 가리킴.
재발 방지
- 작업 시작/중간에
crowny-hub commit으로 스냅샷 확보 (이번에 3개 서비스 첫 커밋 완료: abti 76448ee9, enterprise 76c8cf3c, crownyc d1c21b78) - 한선씨 서버 검증은 격리된 data 디렉토리(
/tmp/abti-test-data/)로 - 서버.한선 데이터 경로를 환경변수/상대경로로 분리 (잔여 작업)
관련 파일
/Users/ef/crowny-abti/서버.한선— JSON API 정렬, TCP읽기, 무작위정수/Users/ef/crowny-abti/scripts/test-pipeline.한선—;주석/예약어 수정/Users/ef/CrownyOS/crownyc/libs/JSON.한선—_맵인가정밀화/Users/ef/CrownyOS/crownyc/libs/ABTI서버.한선— TCP읽기 2인자
잔여 이슈
- profiles.json 원본 2개 유실 — 사용자 판단 대기 (Time Machine 복구 가능성)
- 서버.한선 데이터 경로 외부화 (절대경로 → 환경변수)
- JSON 직렬화에서
거짓(-1)이false아닌-1로 출력 — JSON.한선 boolean 처리 - 한선씨 서버 단독 구동이 검증됐으므로 server.js/crowny-admin-server.js 제거 시 소버린 비율 대폭 상승 (단 클라이언트 JS 4종은 별도 — HTML script src)