미들웨어

Last update - 2025. 9. 5.

개요

미들웨어는 요청과 응답 사이에서 실행되는 함수로, 로깅, 인증, CORS 처리 등의 공통 기능을 제공합니다. Orbital은 Express.js와 유사한 미들웨어 시스템을 제공합니다.

기본 미들웨어

로깅 미들웨어

use orbital::router::Router;

let mut router = Router::new("Logged Router");

// 로깅 미들웨어 추가
router.use_logger();

// 이제 모든 요청이 로깅됩니다
router.read("/api/data", Arc::new(|_ctx| {
    Ok(RouteResponse::json(serde_json::json!({
        "data": "This request will be logged"
    })))
}));

CORS 미들웨어

use orbital::router::Router;

let mut router = Router::new("CORS Router");

// CORS 미들웨어 추가
router.use_cors();

// API 라우트들
router.read("/api/users", Arc::new(|_ctx| {
    Ok(RouteResponse::json(serde_json::json!({
        "users": []
    })))
}));

router.create("/api/users", Arc::new(|ctx| {
    Ok(RouteResponse::created(serde_json::json!({
        "message": "User created"
    })))
}));

에러 핸들링 미들웨어

use orbital::router::Router;

let mut router = Router::new("Error Handling Router");

// 에러 핸들링 미들웨어 추가
router.use_error_handler();

// 에러가 발생할 수 있는 라우트
router.read("/api/error", Arc::new(|_ctx| {
    Err("Something went wrong!".into())
}));

미들웨어 체인

여러 미들웨어 조합

use orbital::router::Router;

let mut api_router = Router::with_base_path("API Router", "/api");

// 미들웨어 체인 구성
api_router
    .use_logger()           // 1. 요청 로깅
    .use_cors()             // 2. CORS 처리
    .use_error_handler();   // 3. 에러 핸들링

// API 라우트들
api_router.read("/users", Arc::new(|_ctx| {
    Ok(RouteResponse::json(serde_json::json!({
        "users": ["Alice", "Bob", "Charlie"]
    })))
}));

api_router.create("/users", Arc::new(|ctx| {
    let name = ctx.body_field("name")
        .and_then(|v| v.as_str())
        .unwrap_or("Unknown");

    Ok(RouteResponse::created(serde_json::json!({
        "user": {
            "name": name,
            "id": 123
        }
    })))
}));

커스텀 미들웨어

MiddlewareBuilder 사용

use orbital::router::{Router, MiddlewareBuilder};

let mut secure_router = Router::with_base_path("Secure API", "/api/secure");

// 인증 미들웨어
secure_router.use_middleware(MiddlewareBuilder::auth(|ctx| {
    // API 키 검증
    ctx.body_field("api_key")
        .and_then(|v| v.as_str())
        .map(|key| key == "secret123")
        .unwrap_or(false)
}));

// 보호된 라우트
secure_router.read("/profile", Arc::new(|_ctx| {
    Ok(RouteResponse::json(serde_json::json!({
        "user": {
            "id": 1,
            "name": "Admin User",
            "role": "administrator"
        }
    })))
}));

다음 단계

미들웨어에 대해 알아보았다면, 다음 문서들을 확인해보세요: