제목
Junior Year Self-Study Notes: Rust 기반 웹 프레임워크 탐구 기록
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- Rust 및 웹 개발에 관심 있는 중급 개발자
- 현대 웹 프레임워크 아키텍처 이해를 원하는 대학원자/학생
- 성능 최적화와 타입 안전성에 주목하는 프론트엔드/백엔드 개발자
핵심 요약
- Zero-Copy Design과 Async-First Architecture로 Tokio 런타임 기반의 고성능 웹 프레임워크 구현
Context
추상화를 통해 불필요한 보일러플레이트 코드 제거 및 메서드 추출 간결화 (예:.get_request_method()
대신.get_request()
사용)- 성능 비교:
324,323.71 QPS
기록으로 Tokio Raw (340,130.92 QPS)에 근접하며, Gin (242,570.16 QPS)보다 우수
섹션별 세부 요약
1. 아키텍처 원칙
- Zero-Copy Design
- 메모리 할당 최소화를 위한 데이터 처리 전략
- 예: set_response_body("Hello World")
로 직접 문자열 처리
- Async-First Architecture
- Tokio 런타임 기반 비동기 처리
- 예: tokio::time::timeout
으로 타임아웃 처리
- 타입 안전한 추상화
- Rust의 타입 시스템을 활용한 컴파일 타임 보장
- 예: Result
타입을 통한 에러 처리
2. Context 추상화
- 보일러플레이트 코드 최소화
- 전통적 접근: .get_request().await.get_method()
- 프레임워크 접근: .get_request_method().await
- 요청/응답 처리 편의성
- set_response_body_json(&data)
로 JSON 직렬화 간편화
- send()
/send_body()
/send_once()
등 다양한 응답 전송 방법 제공
3. 라우팅 및 미들웨어
- 다양한 라우팅 전략
- 정적 라우팅: server.route("/api/users", get_users)
- 동적 파라미터: server.route("/api/users/{id}", get_user_by_id)
- 정규식 검증: server.route("/api/users/{id:\\d+}", get_user_by_id)
- Onion Model 기반 미들웨어 처리
- 인증 미들웨어: auth_middleware
에서 토큰 검증 후 실패 시 401
응답
- 로깅 미들웨어: 요청 시간 측정 및 출력 (start_time.elapsed().as_millis()
)
- 순서 중요: server.request_middleware(auth_middleware).await
후 logging_middleware
등록
4. 성능 비교 및 테스트
- wrk 기반 성능 테스트 결과
- QPS: 324,323.71
(Tokio Raw: 340,130.92
, Rocket: 298,945.31
)
- 메모리 사용량: Low
(Go Standard Library: Low
, Node.js: High
)
- 대기 시간(p95): 0.8ms
(Gin: 1.5ms
, Node.js: 3.2ms
)
- 타임아웃 미들웨어
- timeout(Duration::from_millis(100), ...)
로 요청 제한
5. 보안 및 오류 처리
- SQL 인젝션 방지
- 파라미터화된 쿼리 사용: sqlx::query_as!("SELECT * FROM users WHERE id = $1", user_id)
- 입력 검증
- user_id.chars().all(char::is_numeric)
로 숫자 검증
- 에러 처리
- Result
타입으로 Ok/Err
분기 처리
- 예: ctx.set_response_status_code(500)
에 e
오류 메시지 추가
결론
- Rust 기반 웹 프레임워크의 주요 장점: 타입 안전성, 비동기 최적화, 성능 우수성
- 실무 적용 팁:
- Context
추상화를 활용한 코드 간결화
- tokio::time::timeout
으로 요청 제한 처리
- sqlx
라이브러리 사용 시 SQL 인젝션 방지
- 성능 테스트는 wrk
로 QPS, 메모리 사용량, 대기 시간 측정 필수
- 비동기 처리로 대규모 요청 처리 시 Tokio 런타임 추천