콘텐츠로 이동

라우팅과 상태 관리 (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 풀·설정을 한 곳에서 관리하면, 테스트에서도 상태를 쉽게 교체(모킹)할 수 있습니다.

더 알아보기