Choose a default theme

You can change your theme from the menu

Axum

Axum은 Rust로 HTTP 요청을 처리하는 웹 라이브러리다. URL과 메서드를 핸들러에 연결하는 Router, 요청에서 값을 가져오는 추출기, 응답으로 바꾸는 타입을 중심으로 구성한다. Tokio·Hyper와 함께 동작하며 미들웨어는 Tower 생태계를 활용한다.

요청을 타입으로 다루기

경로의 숫자를 Path<u32>로 받거나 JSON 본문을 구조체로 받는 방식으로 파싱을 핸들러의 인자에 표현한다. 형식에 맞지 않는 요청은 추출 단계에서 거부할 수 있다. 다만 숫자로 읽힌 책 번호가 실제 존재하는지, 현재 사용자가 읽을 수 있는지는 별도의 업무 검증이다. 타입 변환과 권한 검사를 같은 문제로 취급하면 안 된다.

장점은 함수와 타입으로 요청 흐름을 구성하고 공통 미들웨어를 조합하기 쉽다는 것이다. Rust의 컴파일 검사와 비동기 생태계를 함께 사용할 수 있다. 반면 추출기·트레이트·수명에 익숙하지 않으면 오류 메시지가 복잡하게 느껴질 수 있다. 관리자 화면·인증·ORM까지 모두 자동 제공하는 통합 플랫폼이 아니므로 필요한 구성요소를 직접 선택해야 한다.

가상 도서 조회 서버

새 Cargo 바이너리 프로젝트의 의존성에 Axum 0.8과 Tokio 1을 추가한다. 아래는 0.8의 중괄호 경로 문법을 사용하는 완전한 main.rs 예제다. 데이터베이스 없이 번호 11 한 건만 다룬다.

[dependencies]
axum = "0.8"
tokio = { version = "1", features = ["macros", "rt-multi-thread", "net"] }
use axum::{extract::Path, http::StatusCode, routing::get, Router};

async fn book(Path(id): Path<u32>) -> Result<String, StatusCode> {
if id == 11 {
Ok("작은 정원의 기록: 대출 가능".to_owned())
} else {
Err(StatusCode::NOT_FOUND)
}
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let app = Router::new().route("/books/{id}", get(book));
let listener = tokio::net::TcpListener::bind("127.0.0.1:4320").await?;
axum::serve(listener, app).await?;
Ok(())
}

cargo run으로 시작한 뒤 /books/11을 조회하면 도서 설명을 받고, /books/12는 404를 받는다. /books/abc는 정수 경로를 추출할 수 없어 요청 오류가 된다. 서로 다른 실패 이유를 구분하면 클라이언트와 로그의 의미가 명확해진다.

확장 시 주의할 점

공유 데이터베이스 풀은 상태로 전달하고 요청마다 새 연결 풀을 만들지 않는다. 요청 본문을 소비하는 추출기는 한 핸들러에서 읽는 순서와 중복 소비를 고려해야 한다. 동기 파일 작업이나 긴 계산을 핸들러 안에서 수행하면 비동기 런타임을 막을 수 있다. 실제 서비스에는 입력 크기·시간 제한과 인증·추적·종료 처리를 필요에 맞게 추가한다.

참고 자료

웹·서버 애플리케이션 개발 도구 지도

JavaScript 실행과 빌드

Node.js · pnpm · Vite · Nitro

화면 스타일

Tailwind CSS

Rust 개발과 비동기

Rust (프로그래밍 언어) · Cargo · Tokio · Axum

Rust 데이터 접근

SQLx · SeaORM

Java 서버 개발

Java (프로그래밍 언어) · Spring Framework · Spring Boot

네이티브 빌드

CMake · pkg-config

이미지·영상 처리

sharp · FFmpeg · ffprobe