#Tower 통합 가이드
버전: 0.33.0 최종 업데이트: 2026-03-15 적용 대상: ranvier (facade), ranvier-runtime, ranvier-http 카테고리: 통합
Tower의 Service/Layer 생태계를 Ranvier의 Transition/Outcome/Bus 패러다임과 함께 활용하세요.
#개요
Tower는 견고한 네트워킹 클라이언트와 서버를 구축하기 위한 모듈형 재사용 가능한 컴포넌트 라이브러리입니다. Service 트레이트와 Layer 미들웨어 추상화를 제공하며, 이는 많은 Rust 웹 프레임워크(Axum, Tonic, Hyper 등)를 구동합니다.
#Tower와 Ranvier
Ranvier는 "핵심은 고집스럽게, 경계는 유연하게" 원칙을 따릅니다:
- 핵심 (고집스러운): Transition/Outcome/Bus/Schematic 패러다임은 협상 불가
- 경계 (유연한): 경계에서 Tower, actix, Axum 또는 모든 Rust 도구 사용 가능
이는 Tower의 Service 및 Layer 미들웨어를 Ranvier transition과 함께 사용할 수 있음을 의미합니다:
- Tower: CORS, 트레이싱, 타임아웃, 속도 제한, 인증을 위한 검증된 미들웨어
- Ranvier: Schematic 시각화, Bus 전파, 조합 가능한 transition
#통합 패턴
Tower와 Ranvier를 통합하는 두 가지 주요 패턴이 있습니다:
#패턴 1: Ranvier 핸들러를 감싸는 Tower 레이어
Ranvier transition 주위에 HTTP 관심사(CORS, 트레이싱, 타임아웃)를 위한 Tower 레이어를 사용합니다:
use tower::ServiceBuilder;
use tower_http::{
cors::CorsLayer,
trace::TraceLayer,
timeout::TimeoutLayer,
};
let service = ServiceBuilder::new()
.layer(CorsLayer::permissive())
.layer(TraceLayer::new_for_http())
.layer(TimeoutLayer::new(Duration::from_secs(30)))
.service(ranvier_adapter); // ← Ranvier 핸들러사용 시기: 검증된 HTTP 미들웨어(CORS, 트레이싱)가 필요한 경우
#패턴 2: 인증을 위한 Tower Service
Tower의 AsyncRequireAuthorizationLayer를 인증에 사용한 후 Ranvier에 전달합니다:
use tower_http::auth::{AsyncAuthorizeRequest, AsyncRequireAuthorizationLayer};
#[derive(Clone)]
struct JwtAuthorizer { secret: String }
impl<B> AsyncAuthorizeRequest<B> for JwtAuthorizer {
type RequestBody = B;
type ResponseBody = String;
type Future = Ready<Result<Request<B>, Response<String>>>;
fn authorize(&mut self, mut request: Request<B>) -> Self::Future {
// JWT 검증 로직...
let auth_ctx = validate_jwt(token, &self.secret)?;
request.extensions_mut().insert(auth_ctx);
ready(Ok(request))
}
}
let service = ServiceBuilder::new()
.layer(AsyncRequireAuthorizationLayer::new(JwtAuthorizer { secret }))
.service(ranvier_adapter);사용 시기: 기존 Tower 인증 레이어가 있거나 Tower 기반 서비스와 통합해야 하는 경우
두 패턴 모두 유효합니다. 패턴 1은 HTTP 관심사에 더 간단하고, 패턴 2는 요청/응답 흐름에 대한 완전한 제어를 제공합니다.
#인증 예제 안내
전체 예제는 examples/auth-tower-integration을 참조하세요.
시연 내용:
- 두 가지 접근 방식: 수동 Layer + Service 구현(교육용) 및 고수준 AsyncAuthorizeRequest 트레이트(권장)
- JWT 검증: Tower 레이어가 JWT를 검증하고 AuthContext를 요청 확장에 저장
- Ranvier transition: 비즈니스 로직이 Bus에서 AuthContext를 읽음(어댑터가 확장에서 추출)
핵심 인사이트: Tower가 토큰 검증 → request.extensions()에 AuthContext 저장 → 어댑터가 Bus로 추출 → Ranvier transition이 Bus에서 접근.
예제 실행:
cd examples/auth-tower-integration
cargo run
# 출력:
# INFO Tower auth layer configured (JWT validation)
# INFO Ranvier pipeline configured (business logic)
# ✅ Success: {"message":"Hello, alice! (Verified by Tower)",...}#Tower 통합을 사용해야 할 때
적합한 사용 사례:
- 기존 Tower 앱에 Ranvier를 점진적으로 추가하려는 경우
- 팀이 이미 Tower를 알고 있고 그 지식을 활용하려는 경우
- 특정 Tower 미들웨어(CORS, 속도 제한, 압축)가 필요한 경우
- Tower를 사용하는 다른 프레임워크(Axum, Tonic)에서 마이그레이션하는 경우
- Ranvier에서 재구현하지 않고 검증된 미들웨어를 사용하려는 경우
권장하지 않는 경우:
- 새 프로젝트를 시작하며 전체 Schematic 시각화를 원하는 경우(순수 Ranvier 사용)
- Bus를 통한 타입 안전 컨텍스트 전파를 우선시하는 경우(Tower는 요청 확장 사용)
- transition을 독립적으로 테스트하려는 경우(Tower 통합은 HTTP 모킹 필요)
새 프로젝트의 경우 Transition 기반 인증(
examples/auth-transition)을 선호하세요. 더 나은 Schematic 시각화, Bus 전파, 테스트 용이성을 제공합니다. Tower 통합은 기존 Tower 앱에서의 점진적 마이그레이션에 사용하세요.
#트레이드오프
| 측면 | Tower 통합 | 순수 Ranvier (Transition 기반) |
|---|---|---|
| 생태계 호환성 | Tower 레이어에 대한 완전한 접근 | Ranvier 전용 |
| Schematic 시각화 | Tower 레이어는 불투명 | Circuit 뷰에서 완전한 가시성 |
| 컨텍스트 전파 | 요청 확장 (런타임) | Bus (컴파일 타임 타입 안전) |
| 테스트 | 통합 테스트 필요 | 간편한 단위 테스트 (Bus 주입) |
| 팀 온보딩 | Tower 지식 활용 | Ranvier 패러다임 학습 |
| 보일러플레이트 | 50-150줄 (Service 트레이트) | 20줄 (transition 매크로) |
| 성능 | 동일 (제로 코스트) | 동일 (제로 코스트) |
#관련 문서
- actix-web 통합 — actix extractor와 Ranvier
- Axum 통합 — Axum 미들웨어와 Ranvier
- auth-comparison.md — Transition vs Tower 상세 비교