Skip to content

fix(proxy): korean-stock bas_dd 미지정 시 최근 영업일로 fallback - #765

Open
vkehfdl1 wants to merge 1 commit into
devfrom
fix/krx-default-business-day
Open

vkehfdl1 wants to merge 1 commit into
devfrom
fix/krx-default-business-day

Conversation

@vkehfdl1

@vkehfdl1 vkehfdl1 commented Nov 2, 2026

Copy link
Copy Markdown
Member

Fixes #763

무엇을 고치나

korean-stock-search/instruction.md 는 bas_dd 에 대해 "없으면 KST 오늘 날짜 기본값, 휴장일이면 최근 영업일로 다시 시도"라고 약속하지만, 프록시는 오늘 날짜로 한 번만 조회하고 재시도가 없었다. 그래서 문서상 기본 동작인 bas_dd 생략이 주말·휴장일·당일 데이터 미공개 시점에 빈 결과/404 를 돌려준다.

재현 (프로덕션, 수정 전)

$ curl -s -G https://k-skill-proxy.nomadamas.org/v1/korean-stock/search --data-urlencode "q=삼성전자"
{"items":[],"query":{"q":"삼성전자","bas_dd":"20261102",...}}                      # 2026-11-02 월, 전일 데이터만 공개된 시점

$ curl -s -G https://k-skill-proxy.nomadamas.org/v1/korean-stock/base-info --data-urlencode "market=KOSPI" --data-urlencode "code=005930"
{"error":"not_found","message":"기준일 20261102 에 KOSPI 시장 종목 005930 을(를) 찾지 못했습니다."}

$ curl -s -G .../search --data-urlencode "q=삼성전자" --data-urlencode "bas_dd=20261030"
{"items":[{"market":"KOSPI","code":"005930","name":"삼성전자보통주",...}]}          # 금요일 = 정상

변경

  • server.js: normalizeKoreanStockDate → normalizeKoreanStockDateInput 으로 bas_dd 입력 여부(basDdExplicit)를 함께 반환. 세 라우트(/search, /base-info, /trade-info)는 bas_dd 미지정일 때만 fallback 하고, 응답 query.bas_dd 에는 실제 사용한 날짜를 담는다. 캐시 키에도 basDdExplicit 를 포함해 "기본 날짜 요청"과 "오늘을 명시한 요청"이 같은 캐시 항목을 공유하지 않게 했다.
  • krx-stock.js: resolveBasDd 공용 헬퍼 추가. 행이 있으면 즉시 중단하고, 없으면 달력 기준으로 하루씩 최대 10일 뒤로 물러난다. 명시한 bas_dd 는 fallback 없이 그대로 사용하며, upstream 오류(모든 시장 실패)면 추가 조회를 하지 않아 장애 시 KRX 를 두들기지 않는다. /base-info·/search 는 날짜별 시장 스냅샷 캐시(buildBaseInfoSnapshotCacheKey)를 공유한다.
  • 10일 안에 아무 데이터도 없으면(장기 휴장 등) 요청받은 날짜(오늘)를 그대로 보고한다.

/trade-info 가 프로덕션에서 502 upstream_error + KRX API HTTP 오류 (status: 401) 로 나오는 문제는 키에 stk_bydd_trd 권한이 없는 ops 이슈로, 이 PR 은 건드리지 않았다(401 메시지/코드는 기존 그대로).

테스트

수정 전 실패 → 수정 후 통과:

  • korean stock search without bas_dd falls back to the most recent trading day — 수정 전 items 가 비어 Cannot read properties of undefined (reading 'code') 로 실패
  • korean stock base-info without bas_dd falls back to the most recent trading day — 수정 전 404 !== 200
  • korean stock trade-info without bas_dd falls back to the most recent trading day — 수정 전 404 !== 200
  • korean stock endpoints honor an explicit bas_dd without fallback probing — 명시한 날짜는 시장별 1회씩만 조회(추가 probe 없음)하고 404/빈 결과 유지
  • korean stock default bas_dd fallback stops after a bounded lookback — 데이터가 아예 없을 때 최대 10일까지만 조회
  • korean stock default bas_dd does not probe older days while the upstream is failing — upstream 장애 시 뒤로 물러나지 않음

전체 스위트: cd packages/k-skill-proxy && node --test → 492 pass / 0 fail / 2 skipped. npm run lint 통과. 프록시 전용 수정이라 changeset 없음.

bas_dd 를 생략하면 KST 오늘 날짜 한 번만 조회해 휴장일/데이터 미공개 시
빈 결과(검색)나 404(base-info/trade-info)를 반환했다. instruction.md 는
'휴장일이면 최근 영업일로 다시 시도'를 약속하고 있다.

- server.js: bas_dd 입력 여부(basDdExplicit)를 정규화 단계에서 구분하고,
  응답 query.bas_dd 는 실제 사용한 날짜를 반환
- krx-stock.js: resolveBasDd 헬퍼로 하루씩(최대 10일) 뒤로 물러나 행이 있는
  최근 영업일을 사용. 명시한 bas_dd 는 fallback 없이 그대로 사용하고,
  upstream 오류일 때는 추가 조회를 하지 않는다
- search/base-info 는 시장 스냅샷 캐시(buildBaseInfoSnapshotCacheKey)를 날짜별로 공유
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant