러스트는 안전성과 성능을 동시에 추구하는 시스템 프로그래밍 언어로, 웹 백엔드 개발에서도 점점 더 많은 관심을 받고 있습니다.
오늘은 웹 개발에 자주 사용되는 주요 러스트 라이브러리들을 살펴보겠습니다.
Axum: 모던 러스트 웹 프레임워크
use axum::{routing::post, Router, Json};
Axum은 Tokio 팀에서 개발한 인기 있는 웹 프레임워크입니다. 비동기 처리에 최적화되어 있으며, 타입 안전성과 성능을 중요시합니다.
- routing::post: HTTP POST 요청을 처리하는 라우트를 정의합니다.
- Router: 애플리케이션의 라우팅을 구성하는 핵심 구조체입니다.
- Json: 요청과 응답의 JSON 직렬화/역직렬화를 처리합니다.
Axum은 미들웨어, 에러 처리, 상태 공유 등 웹 서버 개발에 필요한 다양한 기능을 제공하면서도 코드의 간결함을 유지할 수 있게 해줍니다.
Reqwest: HTTP 클라이언트 라이브러리
use reqwest::Client;
Reqwest는 러스트에서 가장 널리 사용되는 HTTP 클라이언트 라이브러리입니다. 외부 API와의 통신이 필요할 때 사용됩니다.
- Client: HTTP 요청을 보내는 클라이언트로, 연결 풀링, 리다이렉션 처리, 쿠키 관리 등의 기능을 제공합니다.
비동기 방식으로 동작하여 높은 동시성을 제공하며, JSON, 폼 데이터, 멀티파트 요청 등 다양한 형식의 데이터 처리를 지원합니다.
표준 라이브러리의 컬렉션
use std::collections::HashMap;
러스트 표준 라이브러리의 컬렉션 모듈은 다양한 데이터 구조를 제공합니다.
- HashMap: 키-값 쌍을 저장하는 해시 맵 자료구조로, 웹 애플리케이션에서 데이터 매핑과 캐싱에 자주 사용됩니다.
HashMap은 상수 시간(O(1)) 조회 성능을 제공하면서도 러스트의 소유권 시스템을 통해 메모리 안전성을 보장합니다.
시간 관리
use std::sync::Duration;
Duration은 시간 간격을 표현하는 구조체입니다.
- Duration: 초, 밀리초 등의 단위로 표현된 시간 간격을 나타냅니다. 타임아웃 설정, 주기적 작업 실행, 성능 측정 등에 활용됩니다.
Tokio: 비동기 런타임
use tokio::sync::mpsc;
Tokio는 러스트의 대표적인 비동기 런타임으로, 고성능 네트워크 애플리케이션 개발에 필수적입니다.
- sync::mpsc: 멀티 프로듀서, 싱글 컨슈머(Multiple Producer, Single Consumer) 채널을 제공합니다. 서로 다른 태스크 간 안전한 메시지 전달에 사용됩니다.
이 채널을 통해 비동기 태스크 간 통신이 가능하며, 복잡한 동시성 패턴을 간단하게 구현할 수 있습니다.
Tracing: 로깅과 진단
use tracing::error;
Tracing은 구조화된 로깅과 진단 정보를 제공하는 라이브러리입니다.
- error: 오류 수준의 로그 메시지를 기록합니다. 애플리케이션에서 발생한 심각한 문제를 추적하는 데 사용됩니다.
Tracing은 단순 로깅을 넘어 분산 시스템에서의 요청 추적, 성능 프로파일링 등 다양한 진단 기능을 제공합니다.
Serde: 직렬화 & 역직렬화
use serde::{Deserialize, Serialize};
- Serialize: 러스트 데이터 구조를 JSON, YAML, TOML 등 다른 데이터 형식으로 변환(직렬화)할 수 있게 해주는 트레이트(trait)입니다.
- Deserialize: JSON, YAML, TOML 등의 데이터를 러스트 데이터 구조로 변환(역직렬화)할 수 있게 해주는 트레이트입니다.
사용예시
#[derive(Serialize, Deserialize)]
struct User {
id: u64,
name: String,
email: Option<String>,
}
// 객체를 JSON으로 직렬화
let user = User {
id: 1,
name: "홍길동".to_string(),
email: Some("hong@example.com".to_string()),
};
let json = serde_json::to_string(&user).unwrap();
// JSON에서 객체로 역직렬화
let user: User = serde_json::from_str(&json).unwrap();
그래서 이걸 왜 함?
1. 성능: 컴파일 시점에 코드 생성을 통해 최적화된 직렬화/역직렬화 로직을 제공합니다.
2. 유연성: JSON, YAML, TOML, MessagePack 등 다양한 데이터 형식을 지원합니다.
3. 확장성: 사용자 정의 타입에 대한 직렬화/역직렬화 로직을 쉽게 구현할 수 있습니다.
4. 타입 안전성: 러스트의 강력한 타입 시스템과 통합되어 타입 안전한 데이터 처리가 가능합니다.
'Backend(Framework) > Rust' 카테고리의 다른 글
[Rust] 응답 객체 패턴: ResponseDto 구현 (0) | 2025.03.25 |
---|---|
[Rust] 구조체 (0) | 2025.03.25 |
#[derive(...)] : 러스트의 매크로 속성 (0) | 2025.03.25 |