Backend(Framework)/Rust / / 2025. 3. 25. 10:37

러스트(Rust) 웹 개발의 핵심 라이브러리 소개

러스트는 안전성과 성능을 동시에 추구하는 시스템 프로그래밍 언어로, 웹 백엔드 개발에서도 점점 더 많은 관심을 받고 있습니다.

 

오늘은 웹 개발에 자주 사용되는 주요 러스트 라이브러리들을 살펴보겠습니다.

 

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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유