라우팅과 상태 관리 (Routing & State)¶
axum 은 Rust 의 HTTP 라우팅·요청 처리 라이브러리로, 매크로 없이 라우터를 구성하고 추출기(extractor) 로 요청을 선언적으로 파싱합니다. tower/tower-http 의 미들웨어 생태계를 그대로 씁니다. 이 장은 라우팅과 공유 상태(State) 주입을 데이터스케쳐스의 Rust 백엔드 관점에서 정리합니다.
라우팅 (Router)¶
Router 로 경로를 서비스(핸들러)에 연결합니다. 같은 경로에 여러 메서드를 붙일 수 있어요.
use axum::{Router, routing::get};
let app = Router::new()
.route("/", get(root))
.route("/foo", get(get_foo).post(post_foo));
- 매크로 없이
get/post등 메서드 라우터를 조합합니다. - 경로 파라미터(
{id})와 쿼리·바디는 추출기로 받습니다.
상태 관리 (State)¶
핸들러끼리 공유할 DB 풀·설정·서비스 객체는 State 추출기로 주입합니다. Router<S> 의
S 는 아직 상태가 빠진 라우터를 뜻하고, .with_state(s) 로 상태를 공급하면
Router<()> 로 바뀌어 실행 가능해집니다.
use axum::{extract::State, routing::get, Router};
use std::sync::Arc;
struct AppState { /* ... */ }
let shared = Arc::new(AppState { /* ... */ });
let app = Router::new().route("/", get(handler)).with_state(shared);
State는 요청마다 clone 됩니다(보통Arc로 공유).- 핸들러가 상태의 일부만 쓰면
FromRef로 하위 상태(slice)만 추출할 수 있습니다.
응답 모델·미들웨어¶
- 타입 기반 반환으로 최소 보일러플레이트 응답을 만듭니다.
- 자체 미들웨어 시스템이 없고 tower::Service 를 그대로 사용합니다. tower-http 의
CORS·압축·트레이싱 등을
Router에.layer(...)로 쌓습니다.
데이터스케쳐스 실무 관점¶
- axum 은 Rust 로 성능에 민감한(고성능·저지연) API 경로에 적합합니다. D-SKET 제품에서 크롤링/스트리밍처럼 요청은 많고 응답은 가벼운 경로를 Rust 백엔드로 두는 구조와 잘 맞습니다.
- 공유 상태를
Arc<AppState>로 명시 주입해 DB 풀·설정을 한 곳에서 관리하면, 테스트에서도 상태를 쉽게 교체(모킹)할 수 있습니다.
더 알아보기¶
- 1차(공식): axum (docs.rs)
- 1차(공식): axum extract 문서