경마지 pdf를 통해 파싱 한 데이터를 MongoDB에 저장을 했다. 아직 컨펌된 데이터는 아니지만 전체적인 플로우를 그려나가기 위해 데이터를 가져다가 사용하는 프로젝트를 또 하나 만들었다. 제일 주력으로 사용하는 언어인 rust로 만들었다.
최초에 클로드 코드에게 프로젝트 방향에 대해 설명하는 파일을 생성했다.
# 프로젝트 목표
api 백엔드 서버
client에서 api 요청 시
MongoDB에 저장된 데이터를 읽어서 데이터를 가공하여 보여준다.
언어: rust
프레임워크: axum
비동기 방식
tokio
# client 요청
id: 날짜_장소_경주번호
ex) 20260201_SEOUL_01
# MongoDb 구조
설정은 .env 참조
샘플 데이터 스키마 구조
ex)
더 디테일하지만 위와 같은 느낌으로 작성해 봤다. 아직은 서툴러서 그렇지만 어떻게 하면 클로드가 더 잘 이해할지 수정 보완해나갈 예정이다. 클로드 코드가 알아서 MongoDB에 연결을 하고 데이터를 가공해서 마의 각질을 분석해 주는 테스트 코드를 작성해 보았다.
경주마의 '각질(脚質)'이란 말마다 타고난 달리기 스타일(작전)을 뜻하며, 크게 4가지로 나뉩니다.
도주/선행: 초반부터 빠르게 치고 나가 선두권을 유지하는 스타일
선입: 선두 바로 뒤에서 기회를 엿보다 4코너 이후 승부를 거는 스타일
추입: 뒤쪽에서 힘을 아끼다가 직선주로에서 폭발적인 스피드로 역전하는 스타일
자유: 레이스 흐름에 따라 어떤 위치에서든 유연하게 대처하는 스타일
#[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(())
}
config와 DbClient 모듈을 만들어서 자동으로 코드를 만들어주는 것을 보고 다시 한번 ai가 정말 잘 만드는구나라고 느꼈다. 그리고 비교적 덜 익숙한 python과 달리 익숙한 rust로 만들어주니 코드를 스스로 검증하고 원하는 방향으로 이끌 수 있어서 토큰을 아낄 수 있었고 퀄리티가 잘 나오는 것 같다.
각 말에 대해서 각질을 분석하는 테스트 코드를 부탁했는데 아래처럼 나왔다.

어떤 유의미한 데이터도 만들 수 있을 것 같다.
먼저 데이터를 가공하여 원하는 데이터를 만들어낸 뒤, api 서비스를 axum으로 만들어달라고 할 예정이다.