[02] 경마지에 숨겨진 0.1초를 찾아서

wangki·2026년 2월 1일

개요

경마지 pdf를 통해 파싱 한 데이터를 MongoDB에 저장을 했다. 아직 컨펌된 데이터는 아니지만 전체적인 플로우를 그려나가기 위해 데이터를 가져다가 사용하는 프로젝트를 또 하나 만들었다. 제일 주력으로 사용하는 언어인 rust로 만들었다.

내용

최초에 클로드 코드에게 프로젝트 방향에 대해 설명하는 파일을 생성했다.

# 프로젝트 목표 
api 백엔드 서버 
client에서 api 요청 시 
MongoDB에 저장된 데이터를 읽어서 데이터를 가공하여 보여준다. 

언어: rust
프레임워크: axum 
비동기 방식 
tokio 

# client 요청 
id: 날짜_장소_경주번호 
ex) 20260201_SEOUL_01


# MongoDb 구조 

설정은 .env 참조 


샘플 데이터 스키마 구조 
ex)

더 디테일하지만 위와 같은 느낌으로 작성해 봤다. 아직은 서툴러서 그렇지만 어떻게 하면 클로드가 더 잘 이해할지 수정 보완해나갈 예정이다. 클로드 코드가 알아서 MongoDB에 연결을 하고 데이터를 가공해서 마의 각질을 분석해 주는 테스트 코드를 작성해 보았다.

** 말의 각질이란 ?

경주마의 '각질(脚質)'이란 말마다 타고난 달리기 스타일(작전)을 뜻하며, 크게 4가지로 나뉩니다.

도주/선행: 초반부터 빠르게 치고 나가 선두권을 유지하는 스타일

선입: 선두 바로 뒤에서 기회를 엿보다 4코너 이후 승부를 거는 스타일

추입: 뒤쪽에서 힘을 아끼다가 직선주로에서 폭발적인 스피드로 역전하는 스타일

자유: 레이스 흐름에 따라 어떤 위치에서든 유연하게 대처하는 스타일

클로드가 생성한 test code

#[tokio::test]
    async fn test_analyze_multiple_races() -> Result<()> {
        let config = Config::from_env()?;
        let client = DbClient::new(&config).await?;

        let ids = client.list_race_ids(3).await?;

        for race_id in ids {
            let race = client.get_race_by_id(&race_id).await?;

            println!("\n{}", "=".repeat(80));
            println!("Race: {}", race.id);
            println!("{}", "=".repeat(80));

            let mut style_counts = std::collections::HashMap::new();

            for horse in &race.horses {
                for record in &horse.race_records {
                    if let Some(section_record) = &record.section_record {
                        let style = classify_running_style(section_record, record.horse_record.rank);
                        *style_counts.entry(format!("{:?}", style)).or_insert(0) += 1;
                    }
                }
            }

            println!("\nRunning Style Distribution:");
            for (style, count) in style_counts {
                println!("  {}: {} times", style, count);
            }
        }

        Ok(())
    }

configDbClient 모듈을 만들어서 자동으로 코드를 만들어주는 것을 보고 다시 한번 ai가 정말 잘 만드는구나라고 느꼈다. 그리고 비교적 덜 익숙한 python과 달리 익숙한 rust로 만들어주니 코드를 스스로 검증하고 원하는 방향으로 이끌 수 있어서 토큰을 아낄 수 있었고 퀄리티가 잘 나오는 것 같다.

각 말에 대해서 각질을 분석하는 테스트 코드를 부탁했는데 아래처럼 나왔다.

어떤 유의미한 데이터도 만들 수 있을 것 같다.

결론

먼저 데이터를 가공하여 원하는 데이터를 만들어낸 뒤, api 서비스를 axum으로 만들어달라고 할 예정이다.

0개의 댓글