IMCAT.DEV
로그인 가입
Rust 중급 프로젝트

Rust API 설계 및 사용

Rust API 설계 및 사용 — 중급

API 설계 및 사용

1. 도입 (왜 배워야 하는가)

API(응용 프로그램 프로그래밍 인터페이스)는 소프트웨어가 서로 소통하는 방법을 정의합니다. 효과적인 API 설계는 서로 다른 시스템이나 서비스 간의 상호작용을 원활하게 만들어 주며, 이는 실무에서 매우 중요한 요소입니다. 예를 들어, 쇼핑몰 웹사이트에서 결제 시스템과 장바구니 시스템이 서로 통신할 수 있도록 하는 것이 API의 역할입니다.

반대로, API를 잘 설계하지 않으면 시스템 간의 통신이 복잡해지고, 유지보수가 어려워지며, 결국 사용자 경험이 저하됩니다. 또한, 잘못된 API 설계는 보안 문제를 초래할 수 있으며, 이는 비즈니스에 심각한 영향을 미칠 수 있습니다.

2. 핵심 개념 설명

  • RESTful API: HTTP를 사용하여 자원(데이터)에 접근하는 방식으로, 각 자원은 고유한 URI(Uniform Resource Identifier)를 가집니다. 예를 들어, 쇼핑몰의 제품 데이터는 /products와 같은 경로로 접근할 수 있습니다.
  • HTTP 메서드: API와 상호작용할 때 사용하는 방법으로, GET(조회), POST(생성), PUT(수정), DELETE(삭제) 등이 있습니다. 이를 통해 클라이언트가 서버에 어떤 작업을 요청하는지를 명확히 할 수 있습니다.
  • JSON: API에서 데이터를 주고받을 때 가장 많이 사용하는 형식으로, 사람이 읽기 쉬우며 대부분의 프로그래밍 언어에서 쉽게 처리할 수 있습니다.
  • 용어설명
    RESTful APIHTTP를 사용하여 자원에 접근하는 아키텍처 스타일
    HTTP 메서드API와의 상호작용을 정의하는 방법
    JSON데이터 전송 형식으로 널리 사용됨

    3. 기본 코드 예제

    아래는 기본적인 RESTful API를 Rust로 구현하는 예제입니다. 이 예제에서는 warp라는 라이브러리를 사용하여 간단한 GET 요청을 처리합니다.

    use warp::Filter;
    
    #[tokio::main]
    async fn main() {
        // "/hello" 경로로 GET 요청을 처리
        let hello = warp::path("hello")
            .map(|| warp::reply::json(&"안녕하세요, API!"));
    
        // 3030 포트에서 서버 실행
        warp::serve(hello).run(([127, 0, 0, 1], 3030)).await;
    }

    위 코드를 실행한 후, 웹 브라우저 또는 Postman과 같은 도구를 사용하여 http://localhost:3030/hello에 접근하면 다음과 같은 결과를 얻습니다.

    "안녕하세요, API!"

    코드 한 줄씩 동작 설명

    1. use warp::Filter;: warp 라이브러리의 Filter 모듈을 가져옵니다.
    2. #[tokio::main]: 비동기 메인 함수로 설정합니다.
    3. let hello = warp::path("hello")...: /hello 경로에 대한 필터를 정의합니다.
    4. warp::serve(hello).run(([127, 0, 0, 1], 3030)).await;: 3030 포트에서 서버를 실행합니다.
    5. 4. 실전 활용 예제

      예제 1: 쇼핑몰 장바구니 API

      쇼핑몰에서 장바구니에 상품을 추가하는 API를 설계할 수 있습니다.

      use warp::Filter;
      use serde::{Deserialize, Serialize};
      
      #[derive(Debug, Deserialize, Serialize)]
      struct Item {
          id: u32,
          name: String,
      }
      
      #[tokio::main]
      async fn main() {
          let add_to_cart = warp::path("add_to_cart")
              .and(warp::post())
              .and(warp::body::json())
              .map(|item: Item| {
                  // 장바구니에 아이템 추가 로직
                  warp::reply::json(&format!("Item {} added to cart!", item.name))
              });
      
          warp::serve(add_to_cart).run(([127, 0, 0, 1], 3030)).await;
      }

      이 API에 POST 요청을 보내면 장바구니에 아이템이 추가됩니다.

      예제 2: 사용자 정보 조회 API

      사용자 정보를 조회하는 API를 구현할 수 있습니다.

      #[derive(Debug, Deserialize, Serialize)]
      struct User {
          id: u32,
          name: String,
      }
      
      #[tokio::main]
      async fn main() {
          let get_user = warp::path!("user" / u32)
              .map(|user_id| {
                  // 사용자 정보 조회 로직
                  let user = User { id: user_id, name: "홍길동".to_string() };
                  warp::reply::json(&user)
              });
      
          warp::serve(get_user).run(([127, 0, 0, 1], 3030)).await;
      }

      이 API에 GET /user/1 요청을 보내면 해당 사용자 정보를 얻을 수 있습니다.

      5. 흔한 실수와 주의사항

      실수 1: 잘못된 HTTP 메서드 사용

    6. 잘못된 코드:
    7. let get_user = warp::path!("user" / u32)
          .and(warp::get())
    8. 올바른 코드:
    9. let get_user = warp::path!("user" / u32)
          .and(warp::get()) // GET 메서드 사용

      주의사항: 각 API는 정의된 HTTP 메서드를 사용해야 합니다.

      실수 2: JSON 파싱 오류

    10. 잘못된 코드:
    11. .map(|item: String| { ... }) // 잘못된 타입 사용
    12. 올바른 코드:
    13. .map(|item: Item| { ... }) // 올바른 타입 사용

      주의사항: JSON 바디를 파싱할 때, 적절한 구조체를 사용해야 합니다.

      6. 정리

    14. API 설계는 시스템 간의 원활한 통신을 위해 필수적입니다.
    15. RESTful API, HTTP 메서드, JSON은 API 설계의 핵심 개념입니다.
    16. Rust의 warp 라이브러리를 사용하면 간단하게 API를 구현할 수 있습니다.
    17. 다음에 학습하면 좋은 주제: actix-web을 이용한 고성능 API 개발, API 문서화 도구 사용법 (예: Swagger).