Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[bug] 종목 최신화시 데이터가 db에 반영되지 않는 문제 #287

Closed
yonghwankim-dev opened this issue Apr 1, 2024 · 0 comments · Fixed by #290
Closed

[bug] 종목 최신화시 데이터가 db에 반영되지 않는 문제 #287

yonghwankim-dev opened this issue Apr 1, 2024 · 0 comments · Fixed by #290
Assignees
Labels
bug Something isn't working feat 기능

Comments

@yonghwankim-dev
Copy link
Member

yonghwankim-dev commented Apr 1, 2024

상황

매일 오전 8시에 종목을 최신화하여 상장된 종목들은 db에 저장되고 폐지된 종목들은 db에서 제거되어야 하는데 스케줄링 메서드의 로그상으로는 추가된 종목들이 있으나 실제 db에는 종목 데이터가 반영되지 않습니다.

3개의 종목이 추가되기 전에 테스트를 위해서 084180 종목만 일부러 지우지 않고 123840, 082740만 지웠습니다.
그러나 오전 8시에 찍힌 로그의 결과는 2개(123840, 082740)이 아닌 다음과 같이 지우지도 않은 3개의 결과였습니다.
image

그리고 db에는 추가된 3개의 종목이 반영되었는지 확인하기 위해서 조회했습니다.

select * from stock where stock.ticker_symbol in ('084180', '123840', '082740');

결과는 다음과 같이 종목들은 저장되지 않았습니다.
image

로그에 추가된 종목들의 티커가 찍히기 위해서는 db에 저장이 되어야 하기 때문에 현재 추측으로는 종목들이 저장되었지만 어떤 일로 인하여 제거되는 것으로 추측하고 있습니다.

원인

기존 stocks.tsv 파일을 이용한 종목 최신화 스케줄링 메서드가 하루에 한번 자정에 실행시 기존 최신화된 종목들을 삭제한 것이 원인이었습니다.

예를 들어 기존의 종목을 최신화하는 방식은 하루에 한번 자정에 한번씩 실행하여 stocks.tsv 파일과 open api 서버로부터 받은 최신 종목들을 가져온 다음에 기존 stocks.tsv 파일에 있는 종목들중에서 서버로부터 받은 최신 종목들에서 공통된 것을 제거한 다음에 남아있는 종목들을 제거하고 있습니다. 기존 소스 코드는 다음과 같습니다.

@Scheduled(cron = "0 0 * * * ?")
	@Transactional
	public void refreshStockFile() {
		String requestUri = "http://data.krx.co.kr/comm/bldAttendant/getJsonData.cmd";
		String responseText = webClient.post(requestUri, createHeader(), createStockInfoBody(), String.class);
		Set<StockDataResponse.StockInfo> response = ObjectMapperUtil.deserialize(responseText, StockDataResponse.class)
			.getStockInfos();
		Set<StockDataResponse.StockInfo> initialStockInfos = StockFileUtil.readStockFile();
		initialStockInfos.removeAll(response);
		log.debug("initialStockInfos : {}",
			initialStockInfos.stream().map(StockDataResponse.StockInfo::getTickerSymbol).collect(
				Collectors.toList()));
		for (StockDataResponse.StockInfo stockInfo : initialStockInfos) {
			Optional<PortfolioHolding> portfolioHolding = portfolioHoldingRepository.findByTickerSymbol(
				stockInfo.getTickerSymbol());
			if (portfolioHolding.isPresent()) {
				purchaseHistoryRepository.deleteByPortfolioHoldingId(portfolioHolding.get().getId());
				portfolioHoldingRepository.deleteById(portfolioHolding.get().getId());
			}
			stockDividendRepository.deleteByTickerSymbol(stockInfo.getTickerSymbol());
			stockRepository.deleteByTickerSymbol(stockInfo.getTickerSymbol());
		}
		StockFileUtil.convertToTsvFile(response);

		System.out.println(0);
	}

위 서비스 메서드를 api를 통하여 호출했을때 최신 종목들과 비교하여 공통된 종목들을 삭제하고 남은 initialStockInfos 컬렉션 상태는 다음과 같았습니다.

initialStockInfos : [123840, 397880, 082740, 224020, 084180, 150440]

로그로 기록된 위 종목들은 서버로부터 받은 최신 종목들과 공통되지 않고 남은 종목들이므로 상장 폐지된 종목들임을 알 수 있습니다. 따라서 해당 스케줄링 메서드에서는 종목들에 달려 있는 포트폴리오 종목, 매입 이력등을 사전에 제거한 다음에 최종적으로 종목 데이터가 삭제되는 것을 볼 수 있습니다.

서버를 시작하고 나서 위 종목들을 조회해보면 기존 종목 최신화전에 남아있는 것을 볼 수 있습니다.
image

이번에는 임시로 만든 api를 통해서 종목 파일 최신화를 수행해봅니다.
image

로그로 찍힌 결과는 위 설명과 같이 나옵니다.

initialStockInfos : [123840, 397880, 082740, 224020, 084180, 150440]

종목 파일을 최신화 한다음에 db 조회한 결과는 다음과 같습니다.

select * from stock where stock.ticker_symbol in ('123840', '397880', '082740', '224020', '084180', '150440');
image - 위 결과를 보면 성공적으로 종목들이 삭제된 것을 볼 수 있습니다.

이번에는 새로 추가한 종목 최신화 스케줄링 메서드를 실행해보겠습니다. 포스트맨을 통하여 실행한 결과는 다음과 같습니다.
image

db로 조회시 결과는 다음과 같습니다.

select * from stock where stock.ticker_symbol in ('084180', '123840', '082740', '475150', '455900', '420570', '475240', '036220', '437730');
image 위 9개의 종목은 새로 상장된 종목들입니다.

위와 같은 테스트를 통하여 기존 종목 최신화 스케줄링 메서드가 실행되어 추가된 종목 최신화 스케줄링 메서드가 실행하고 난 이후의 종목들을 삭제했다는 것을 알게 되었습니다.

해결방법

기존 구현한 종목 최신화 스케줄링 메서드를 삭제하였습니다.

@yonghwankim-dev yonghwankim-dev added bug Something isn't working feat 기능 labels Apr 1, 2024
@yonghwankim-dev yonghwankim-dev added this to the [BE] Sprint #23 milestone Apr 1, 2024
@yonghwankim-dev yonghwankim-dev self-assigned this Apr 1, 2024
@yonghwankim-dev yonghwankim-dev linked a pull request Apr 2, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working feat 기능
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

1 participant