Learn Rust Coding · 강의

Actix-web/Rocket으로 REST API 만들기

Actix-web이나 Rocket과 같은 최신 Rust 웹 프레임워크를 사용해 RESTful API를 개발하고 경로, 요청, 응답을 처리합니다.

레슨 1/311개 단계

Actix-web/Rocket으로 REST API 만들기은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 3개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.

REST API란 무엇인가요?

REST, 즉 RE표현 상태 전송(Representational State Transfer)은 네트워크 애플리케이션을 위한 아키텍처 스타일입니다. 웹 서비스가 통신하는 방식을 정의하는 일련의 원칙을 제공합니다.

이를 상태를 저장하지 않고 캐시할 수 있으며, 표준 HTTP 메서드로 리소스와 상호 작용하는 웹 서비스를 구축하기 위한 지침 모음이라고 생각해 보세요.

  • 리소스: 사용자, 상품, 주문처럼 이름을 지정할 수 있는 모든 것입니다.
  • URI: 리소스를 식별하는 고유 식별자입니다(예: /users/123).
  • HTTP 메서드: 리소스에 수행하는 표준 작업입니다(GET, POST, PUT, DELETE).

웹 서비스에 Rust를 사용하는 이유

Rust는 웹 서비스 개발에 고유한 장점을 제공하므로, 고성능과 안정성이 필요한 API를 개발하기에 적합합니다.

  • 성능: Rust의 비용 없는 추상화 덕분에 매우 효율적인 코드를 작성할 수 있으며, 성능이 C/C++와 비슷한 경우가 많습니다.
  • 메모리 안전성: 소유권 시스템이 널 포인터 역참조나 데이터 경합 같은 일반적인 버그를 방지하여 더욱 견고한 서비스를 만들 수 있습니다.
  • 동시성: Rust의 async/await 모델은 안전성 보장과 결합되어 동시 웹 서비스를 ‘두려움 없이’ 구축할 수 있게 합니다.
  • 신뢰성: 강력한 타입 시스템과 컴파일 시 검사가 많은 오류를 조기에 찾아냅니다.

Actix-web 알아보기

Rust로 웹 서비스를 구축할 때는 프레임워크를 자주 사용합니다. Actix-web은 Rust를 위한 강력하고 실용적이며 매우 빠른 웹 프레임워크입니다.

Actix-web은 액터 프레임워크인 Actix를 기반으로 하지만, Actix-web을 효과적으로 사용하기 위해 액터를 이해할 필요는 없습니다. 비동기 작업을 위해 설계되었으므로 여러 API 요청을 동시에 처리하는 것처럼 입출력이 작업을 제한하는 경우에 적합합니다.

Actix-web은 라우팅, 요청 및 응답 처리, 미들웨어 등을 위한 도구를 제공하여 복잡한 API를 쉽게 만들 수 있게 합니다.

프로젝트 설정 및 종속성

먼저 새 Rust 프로젝트를 만들고 필요한 종속성을 추가하겠습니다. 프레임워크에는 actix-web을 사용하고, JSON 데이터를 직렬화하고 역직렬화하는 데는 serde를 사용하겠습니다.

먼저 새 프로젝트를 만드세요.

cargo new my_rest_api --bin

그런 다음 Cargo.toml 파일의 [dependencies] 섹션에 다음 줄을 추가하세요.

[dependencies]
actix-web = "4"
serde = { version = "1.0", features = ["derive"] }

첫 번째 Actix-web 서버

간단한 Actix-web 서버를 작성해 보겠습니다. 이 코드는 8080 포트에서 들어오는 HTTP 요청을 수신하는 기본 구조를 설정합니다. 아직 특정 경로를 처리하지는 않지만, 서버의 기반이 됩니다.

#[actix_web::main] 매크로는 async fn main이 Actix-web의 실행 환경과 호환되도록 합니다.

use actix_web::{App, HttpServer};

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        // Our application instance, where we'll add routes
        App::new()
    })
    .bind(("127.0.0.1", 8080))? // Bind to an IP address and port
    .run() // Start the server
    .await // Await its completion
}

GET 경로 정의하기

이제 서버에 간단한 경로를 추가해 보겠습니다. 경로는 들어오는 HTTP 요청의 경로와 메서드(예: GET /hello)를 특정 처리기 함수에 연결합니다.

처리기 함수 hello_world는 문자열을 반환하기만 합니다. web::get().to()는 /hello 경로에 대한 GET 요청에 이 처리기를 등록합니다.

use actix_web::{web, App, HttpServer, Responder};

// A handler function that returns a simple string response
async fn hello_world() -> impl Responder {
    "Hello, Actix-web!"
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // Register our route: GET /hello maps to hello_world()
            .route("/hello", web::get().to(hello_world))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

동적 경로를 위한 경로 매개변수

API는 URL에서 ID나 이름처럼 동적으로 바뀌는 부분을 처리해야 하는 경우가 많습니다. Actix-web은 이러한 값을 추출하기 위해 경로 매개변수를 사용합니다.

경로에 자리 표시자를 정의합니다(예: /{name}). 처리기에서는 web::Path<String> 또는 역직렬화할 수 있는 다른 타입을 사용해 값을 추출합니다.

use actix_web::{web, App, HttpServer, Responder};

// Handler function with a path parameter 'name'
async fn greet_name(name: web::Path<String>) -> impl Responder {
    format!("Hello, {}!", name.into_inner())
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // Route with a dynamic path segment for a name
            .route("/greet/{name}", web::get().to(greet_name))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

POST 요청 및 JSON 처리

리소스를 생성하거나 수정할 때는 POST 또는 PUT 요청을 사용하며, 요청 본문에 JSON 형식으로 데이터를 보내는 경우가 많습니다.

Actix-web에서는 web::Json<T>를 사용해 JSON을 쉽게 처리할 수 있습니다. 예상하는 JSON 구조에 맞는 Rust struct를 정의하고 serde의 Deserialize를 파생하면, Actix-web이 들어오는 JSON을 자동으로 해당 구조체로 구문 분석합니다.

use actix_web::{web, App, HttpServer, Responder};
use serde::{Deserialize, Serialize};

// Define a struct to represent our incoming JSON data
#[derive(Deserialize, Serialize)]
struct User {
    username: String,
    email: String,
}

// Handler for POST requests that accepts a JSON User object
async fn create_user(user: web::Json<User>) -> impl Responder {
    // In a real app, you'd save this user to a database
    format!("User created: {} ({})", user.username, user.email)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // POST /users expects a JSON body and maps to create_user()
            .route("/users", web::post().to(create_user))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

상태를 사용하는 간단한 API 만들기

지금까지 배운 내용을 결합하여 메모리에서 사용자 목록을 관리하는 작은 API를 만들어 보겠습니다. web::Data를 사용해 애플리케이션별 상태(사용자 목록)를 여러 처리기에서 공유하겠습니다.

std::sync::Mutex는 여러 동시 요청에서 Vec<User>에 안전하게 변경 접근할 수 있도록 하는 데 사용됩니다. GET /users와 POST /users 엔드포인트를 만들겠습니다.

use actix_web::{web, App, HttpServer, Responder, HttpResponse};
use serde::{Deserialize, Serialize};
use std::sync::Mutex; // For shared mutable state

// Define a User struct that can be serialized/deserialized and cloned
#[derive(Deserialize, Serialize, Clone)]
struct User {
    id: u32,
    username: String,
    email: String,
}

// Application state to hold our users and track next ID
struct AppState {
    users: Mutex<Vec<User>>,
    next_id: Mutex<u32>,
}

// Handler to get all users
async fn get_users(data: web::Data<AppState>) -> impl Responder {
    let users = data.users.lock().unwrap(); // Acquire a lock
    web::Json(users.clone()) // Return users as JSON
}

// Handler to create a new user
async fn create_user(
    data: web::Data<AppState>,
    new_user: web::Json<User>,
) -> impl Responder {
    let mut users = data.users.lock().unwrap();
    let mut next_id = data.next_id.lock().unwrap();

    let user = User {
        id: *next_id,
        username: new_user.username.clone(),
        email: new_user.email.clone(),
    };
    users.push(user.clone());
    *next_id += 1; // Increment for the next user
    HttpResponse::Created().json(user) // Return 201 Created status and user
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    // Create shared application state
    let app_state = web::Data::new(AppState {
        users: Mutex::new(vec![]), // Initialize with an empty user list
        next_id: Mutex::new(1),    // Start IDs from 1
    });

    HttpServer::new(move || { // 'move' closure to capture app_state
        App::new()
            .app_data(app_state.clone()) // Register shared state with the app
            .route("/users", web::get().to(get_users))
            .route("/users", web::post().to(create_user))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

API 개념 빠른 확인

기본 Actix-web 서버를 설정하고 다양한 HTTP 요청을 처리하는 방법을 배웠습니다. 이해한 내용을 확인해 보겠습니다!

복습 및 다음 단계

잘하셨습니다! Rust와 Actix-web으로 REST API를 구축하는 첫걸음을 내디뎠습니다.

  • REST API의 기본 개념과 Rust가 적합한 이유를 살펴보았습니다.
  • 기본 Actix-web 프로젝트를 설정하는 방법을 배웠습니다.
  • GET 및 POST 경로를 정의하는 방법을 살펴보았습니다.
  • 경로 매개변수를 추출하고 JSON 데이터를 처리하는 방법을 확인했습니다.
  • 마지막으로 web::Data를 사용해 메모리 상태를 관리하는 간단한 API를 만들었습니다.

다음에는 데이터베이스를 통합하고 견고하게 오류를 처리하여 더욱 강력하고 실제 서비스에 바로 사용할 수 있는 웹 서비스를 만들어 보겠습니다!

무료로 시작

AI 튜터와 함께 Rust을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
144

자주 묻는 질문

“Actix-web/Rocket으로 REST API 만들기” 강의는 무료인가요?

네 — “Actix-web/Rocket으로 REST API 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.

“Actix-web/Rocket으로 REST API 만들기”에서 뭘 배우나요?

Actix-web이나 Rocket과 같은 최신 Rust 웹 프레임워크를 사용해 RESTful API를 개발하고 경로, 요청, 응답을 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 1번째 강의입니다.

“Actix-web/Rocket으로 REST API 만들기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Actix-web/Rocket으로 REST API 만들기
  2. 데이터베이스 통합(SQLx/Diesel)
  3. 인증과 권한 부여
← Learn Rust Coding(으)로 돌아가기