2026.09 – 진행 중
HAeFIPA (해피파)
FC 온라인 올인원 파트너 PWA. 수수료·강화 계산, 쿠폰, 선수 갱신시간 알림을 탭 전환만으로 해결하는 상시 대기형 앱.
링크 열기 ↗배경
FC 온라인(EA SPORTS FC ONLINE) 유저는 수수료 계산, 쿠폰 등록, 강화 재료 계산, 선수 가격 갱신시간 확인 같은 필수 정보를 매번 흩어진 사이트·커뮤니티를 오가며 찾는다. 이 파편화된 정보를 하나의 화면에서 탭 전환만으로 해결하는 모바일 웹앱(PWA)을 기획했다.
한 일
- 홈 / 알림센터 / 계산기 / 선수정보 4탭 구조 설계, 홈 대시보드에 “오늘의 숙제” 체크리스트 구성
- 수수료 계산기, 집중훈련(OVR 상승) 비용 계산기, 강화(+1~+10) 성공률 기반 기대비용 계산기 구현
- 쿠폰 복사/등록, 관심 선수 watchlist CRUD(익명 UUID 기반), 선수 검색·비교
- 갱신시간 알리미: Cron Worker가 2시간마다 선수 가격을 폴링해 거래량 변화로 갱신 이벤트를 판정하고 KV에 24h TTL로 저장
- 웜 뉴트럴 + 브랜드 그린 액센트 UI, 사용자 다크모드 토글, 홈 화면 설치(PWA)
- 전 과정 Cloudflare 스택(Pages + Workers + D1 + KV + Cron)으로 서버리스 구성,
mainpush 시 자동 배포
트러블슈팅
선수 능력치 데이터 확보
- 넥슨 Open API에는 spid로 OVR·세부 능력치를 조회하는 엔드포인트가 없고, 정적 메타(
spid.json)는{id, name}뿐임을 조사로 확인 - 공식 데이터센터(
POST fconline.nexon.com/datacenter/PlayerAbility)가 반환하는 HTML 조각을 파싱하는 크롤링 파이프라인을 Worker로 구축 (API 키 불필요,n1Strong=0= 강화 없는 기본 OVR) - 백로그 크롤링 + stale(25일 경과) 재크롤링을 별도 Cron으로 분리,
event.cron문자열로 핸들러 분기
Cloudflare D1 무료 한도 초과
- 배포 후 24h 행 쓰기가 36만 건으로 무료 한도(10만 행/일)의 3.6배를 기록,
wrangler d1 info/d1 insights로 원인 특정 - 범인은 88k 선수 카탈로그 시딩의
INSERT ... ON CONFLICT— 인덱스 4개까지 갱신돼 행당 약 4 write 발생, 이 쓰기 예산이 enrich cron까지 같이 굶겨 죽임 - 대응: 시딩을
batch()+ 페이지네이션으로 청크화, 중복 인덱스 제거, 관심 선수 조회 쿼리의 driving 테이블을 큰 players(7.7만 행 풀스캔)에서 작은 watchlist로 교체 - KV 커서를 없애고 “안 끝난 것 중 앞쪽 재선택 + 실패분
-1마킹” 방식으로 enrich를 재설계 → 중간에 죽어도 이어지고 실패분은 자동 재시도
무료 플랜 subrequest 50 한도
- enrich Worker가 선수당 건별 UPDATE를 날려
limit=200에서 “Too many subrequests”로 실패 - D1 쓰기를 실행 말미
batch()1회로 합쳐 fetch 45 + SELECT 1 + batch 1 = 47회로 한도 내 유지
기술적 의사결정
- FastAPI/별도 서버 없이 Cloudflare Workers + D1로만 백엔드를 구성 — 프론트와 동일한 TS 스택, 콜드스타트 없음, 무료 티어로 상시 운영
- 넥슨 API 키는 Workers 환경변수로만 관리하고 클라이언트에 노출하지 않음, 쿠폰은 복사만 제공(자동 입력 불가), 다계정 ID/PW 저장 기능은 제외
- 88k 전체 선수 카탈로그는 무료 한도상 과다 — 상위/고OVR 시즌만 남기는 축소를 검토 중