Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ private synchronized void refreshSymbols(List<String> symbols, boolean missingOn
if (symbols.isEmpty() || !hasCredentials()) {
return;
}
// 토스 종목명 API는 6자리 KRX 종목코드만 허용한다. 랭킹 응답에는 ETN(0197W0) 등
// 비표준 심볼이 섞일 수 있어, 섞이면 chunk 전체 조회가 실패하므로 먼저 걸러낸다.
List<String> requested = symbols.stream()
.filter(symbol -> symbol.matches("\\d{6}"))
.filter(symbol -> !missingOnly || !names.containsKey(symbol))
.distinct()
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,22 @@ void resolvesSupportedMarketIndicatorNamesWithoutAnUpstreamLookup() {
assertThat(service.nameOf("KOSPI")).isEqualTo("코스피 시장");
assertThat(service.nameOf("KOSDAQ")).isEqualTo("코스닥 시장");
}

@Test
void filtersNonSixDigitSymbolsBeforeNameLookup() {
TossApiProperties properties = new TossApiProperties(
"https://example.test", "https://example.test/oauth2/token",
"client-id", "client-secret", List.of());
when(marketDataClient.fetchStockNames(List.of("005930", "069500")))
.thenReturn(Map.of("005930", "삼성전자", "069500", "KODEX 200"));
StockReferenceService service = new StockReferenceService(
properties, marketDataClient, symbolUniverse);

// 랭킹 응답에 섞일 수 있는 ETN 등 비6자리 심볼은 종목명 API 호출에서 제외되어야 한다.
service.refreshMissing(List.of("005930", "0197W0", "069500"));

assertThat(service.nameOf("005930")).isEqualTo("삼성전자");
assertThat(service.nameOf("0197W0")).isNull();
verify(marketDataClient).fetchStockNames(List.of("005930", "069500"));
}
}
Loading