본문 바로가기

코딩(Coding)

Crypto Publisher CLI 애플리케이션을 개발하여 Rust 배우기

반응형

Crypto Publisher CLI 애플리케이션을 개발하여 Rust 배우기

 

Unsplash의 Charl Folscher 사진

저는 항상 프로그래밍 언어를 배울 때 한 번에 한 단계씩 처음부터 응용 프로그램 개발을 시작하는 것이 도움이 된다는 것을 알게 되었습니다. Rust 프로그래밍 언어 책을 다 읽은 후에도 어디서부터 시작해야 할지 막막할 수 있습니다.

이 튜토리얼에서는 암호 가격(예: USD 또는 BTC-USD로 표시된 비트코인 가격)을 표시하는 간단한 명령줄 인터페이스(CLI) 응용 프로그램을 개발하기 전에 최소한 책을 살펴보았다고 가정합니다.

기사에 뛰어들기 전에 모든 소스 코드를 사용할 수 있는 GitHub 리포지토리 => https://github.com/sungkim11/crypto-publisher에 대한 링크를 제공하여 먼저 정리를 좀 해봅시다. 또한 아래와 같이 Rust를 사용하여 어떤 응용 프로그램을 개발할 것인지 보여 드리고자 합니다.

코인베이스 가격 데이터 REST API

Coinbase REST API를 사용하여 비트코인 가격을 미국 달러 또는 BTC-USD(https://developers.coinbase.com/api/v2#data-endpoints)로 가져올 것입니다.

Coinbase REST API를 호출하려면 다음 URL을 복사하여 브라우저에 붙여넣으면 됩니다.

https://api.coinbase.com/v2/prices/BTC-USD/spot

반환하거나 다운로드해야 합니다. response.json 예를 들어 현물 가격과 base-currency 또는 BTC-USD.

{
"data":{
"base":"BTC",
"currency":"USD",
"amount":"40731.94"
}
}

녹 상자

애플리케이션 개발을 시작하기 전에 4개의 Rust 상자를 추가해야 합니다.

  • Serde: Rust 데이터 구조를 효율적이고 일반적으로 직렬화 및 역직렬화하기 위한 프레임워크입니다. 그들의 crates.io URL은 https://crates.io/crates/serde입니다. Serde는 JSON 데이터를 Rust 데이터 구조 또는 Struct에 매핑하는 데 사용됩니다. JSON을 구조체로 역직렬화 또는 변환하고 구조체를 JSON으로 직렬화 또는 변환하는 데 사용됩니다.
  • Reqwest: Rust용 HTTP 클라이언트입니다. 그들의 crates.io URL은 https://crates.io/crates/reqwest입니다. Reqwest Coinbase REST API에 HTTPS 요청을 하는 데 사용됩니다.
  • Tokio: 비동기식 애플리케이션을 작성하기 위한 플랫폼입니다. 그들의 crates.io URL은 https://crates.io/crates/tokio입니다. Tokio는 비동기식 애플리케이션을 개발하는 데 필요합니다.
  • 박수: Rust용 명령줄 인수 파서입니다. 그들의 crates.io URL은 https://crates.io/crates/clap입니다. 명령줄 인터페이스 응용 프로그램을 개발하려면 박수가 필요합니다.

마침내, Cargo.toml 다음과 같이 4개의 상자를 포함하도록 수정됩니다.

[package]
name = "rust-struct"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
serde = { version = "1.0.136", features = ["derive"] }
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1.17.0", features = ["full"] }
clap = { version = "3.1.2", features = ["derive"] }

이 기사에서는 간단한 애플리케이션을 개발한 다음 애플리케이션을 기반으로 빌드하여 후속 학습에서 추가 기능을 추가할 것입니다.

  • Lesson 1: Coinbase REST API를 호출하는 간단한 비동기 애플리케이션
  • 레슨 2: REST API에 대한 비동기 호출을 다른 함수로 이동
  • 3단원: 명령줄 인터페이스 추가
  • 레슨 4: 시간, 암호화 구매 가격, 암호화 판매 가격 및 기타 CLI 매개변수 추가

Lesson 1: Coinbase REST API를 호출하는 간단한 비동기 애플리케이션

제공된 URL을 사용하여 Coinbase Price Data REST API를 호출한 다음 JSON 파일을 프로그래밍 가능한 개체(즉, 구조체)로 처리(즉, 역직렬화)하여 암호화 가격을 인쇄할 수 있는 간단한 비동기 응용 프로그램을 개발할 것입니다.

왜 비동기식 애플리케이션을 개발하는가? 이는 후속 기사에서 rdkafka 상자를 사용하여 Apache Kafka에 암호화 가격을 게시하도록 이 애플리케이션을 개선할 것이기 때문에 애플리케이션 이름은 Crypto Publisher입니다.

JSON(response.json)

다음 JSON에는 아래와 같이 계층 구조 또는 중첩 구조가 있습니다.

{
"data":{
"base":"BTC",
"currency":"USD",
"amount":"40731.94"
}
}

녹 구조

Rust Struct는 데이터 유형이 다음과 같은 두 개의 구조체를 생성하여 중첩 구조를 지원합니다. "코인프라이스" JSON의 중첩 구조를 복제하는 데 사용됩니다. 마지막으로 JSON 데이터를 Rust Struct에 매핑하기 위해 Serde의 Deserialize를 구현합니다. JSON 파일에서 구조체를 만드는 가장 쉬운 방법은 quicktype(https://app.quicktype.io/)으로 이동한 다음 JSON을 소스로 복사하고 Rust를 대상으로 지정하는 것입니다. 필요에 맞게 구조체 이름을 수정했습니다.

#[derive(Serialize, Deserialize, Debug)]
pub struct CoinbasePrice {
pub data: CoinPrice
}#[derive(Serialize, Deserialize, Debug)]
pub struct CoinPrice {
pub base: String,
pub currency: String,
pub amount: String,
}

REST API 요청

구조체를 정의한 후에는 REST API 요청을 해야 합니다. 이것은 다음과 같이 코드에 반영되는 Tokio 런타임을 사용하여 async/.await 구성에 따라 수행됩니다.

  • 미래를 반환한 다음 완료될 때까지 기다리는 REST API 요청(Client::new().get(&spot_url).send().await?)
  • ConibasePrice 구조체에 대한 JSON 응답을 구문 분석하여 미래를 반환한 다음 완료될 때까지 기다립니다(json::().await?;).
let resp_spot_price = Client::new().get(&spot_url).send().await?.json::().await?;

암호화폐 가격 인쇄

마지막으로 struct를 사용하여 암호화 가격을 출력한 다음 마지막에 Ok를 반환합니다. CoinbasePrice 구조체는 다음과 같이 구성되어 있습니다.

CoinbasePrice
data
base
currency
amount

Resp_spot_price에 CoinbasePrice 구조체가 할당되어 있으므로 base = resp_spot_price.data.base입니다.

println!("SPOT: {base}-{currency}: {amount}",
base=resp_spot_price.data.base,
currency=resp_spot_price.data.currency,
amount=resp_spot_price.data.amount);Ok(())

완성된 코드

마지막으로 두 개의 파일이 있는 완성된 코드가 아래에 제공됩니다.

  • main.rs: crypto_publisher_1.rs에서 crypto_publisher 함수를 호출합니다. fn crypto_publisher()가 결과 유형을 반환하므로 unwrap()이 추가되었음을 유의하십시오.
  • crypto_publisher_1.rs

메인.rs

crypto_publisher_1.rs

레슨 2: REST API에 대한 비동기 호출을 다른 함수로 이동

이 단원에서는 다음을 수행합니다.

  • 현물 가격, 구매 가격 및 판매 가격을 얻으려면 이 함수를 세 번 호출해야 하므로 REST API에 대한 비동기 호출을 새 비동기 함수로 이동합니다.
  • 전환하다 crypto_publisher 새로운 비동기 함수를 호출하는 함수에 함수를 추가합니다.

새 비동기 함수 만들기

새로운 비동기 함수가 생성되어 동일한 함수를 사용하여 세 가지 가격을 얻을 수 있습니다.

  • 현물 가격
  • 구매 가격
  • 판매 가격

따라서 새로운 비동기 함수는 get_coin_price() 세 가지 입력 매개변수가 있습니다.

  • 유형(현물, 구매 및 판매)
  • 통화(예: BTS)
  • 요금(예: USD)

다음으로 표현되는 문자열 값을 가진 결과 유형을 반환합니다. Ok(resp_price.data.amount). 다른 모든 코드는 이전 단원과 유사합니다.

전환하다 crypto_publisher 기능을 동기화하는 기능

fn crypto_publisher는 get_coin_price()를 호출한 다음 구문 분석된 반환 값을 인쇄하도록 단순화되었습니다.

완성된 코드

마지막으로 두 개의 파일이 있는 완성된 코드가 아래에 제공됩니다.

  • main.rs: 그냥 호출 crypto_publisher 기능 crypto_publisher_2.rs.
  • crypto_publisher_2.rs

main.rs:

crypto_publisher_2.rs:

3단원: 명령줄 인터페이스 추가

이 단원에서는 다음을 수행합니다.

  • 사용이 간편하고 효율적이며 완전한 기능을 갖춘 명령줄 인수 파서인 Clap을 사용하여 명령줄 인터페이스("CLI")용 구조체를 만듭니다.
  • CLI 코드 기능 추가 crypto_publisher()

명령줄 인터페이스용 구조체 만들기

Clap에는 구조체의 속성을 활용하여 명령줄 인터페이스를 구축하는 Builder API가 있습니다. 다음 구조체는 두 개의 매개변수를 추가합니다.

  • 통화(예: BTC)
  • 요금(예: USD)

CLI 코드 기능 추가 crypto_publisher()

명령줄 인터페이스 값을 허용하기 위해 async fn crypto_publisher()에 CLI 코드를 추가했습니다.

let args = Cli::parse();
let currency = &args.currency;
let rates = &args.rates;

완성된 코드

마지막으로 두 개의 파일이 있는 완성된 코드가 아래에 제공됩니다.

  • main.rs: 그냥 호출 crypto_publisher 기능 crypto_publisher_3.rs.
  • crypto_publisher_3.rs

main.rs:

crypto_publisher_3.rs:

레슨 4: 시간, 암호화 구매 가격, 암호화 판매 가격 및 기타 CLI 매개변수 추가

마지막으로, 우리는 그것을 모두 모아서 신청서를 완성합니다. 다음 기능을 추가합니다.

  • 시간을 가져오는 기능 추가
  • 구매 가격과 판매 가격 사이의 가격 스프레드뿐만 아니라 암호화 구매 가격과 판매 가격을 추가합니다.
  • 두 개의 매개변수를 더 추가합니다. 반복 빈도(또는 애플리케이션이 실행되어야 하는 횟수) 및 간격(또는 어떤 시간 간격으로 — 예: 30초)

시간을 가져오는 기능 추가

새로운 기능 get_coin_time() 와 매우 유사하다 get_coin_price() 입력 매개변수가 없다는 점을 제외하고.

암호화폐 구매 가격과 판매 가격을 추가하고 구매 가격과 판매 가격 사이의 가격 스프레드를 추가합니다.

우리는 향상 crypto_publisher() 다음에 대한 추가 함수 호출을 추가하려면:

그런 다음 현물 가격, 구매 가격, 판매 가격 및 구매 가격과 판매 가격 사이의 가격 스프레드에 대한 가격을 모두 함께 인쇄합니다.

두 개의 매개변수 추가: 반복 빈도 및 반복 간격

구조체의 속성을 활용하여 두 개의 명령줄 인터페이스 매개변수를 더 추가하는 Clap의 Builder API를 사용합니다.

  • 간격(예: 10)
  • 빈도(예: 30000 또는 30초)

그런 다음 두 개의 추가 CLI 매개변수를 통합하는 루프를 추가합니다.

완성된 코드

마지막으로 두 개의 파일이 있는 완성된 코드가 아래에 제공됩니다.

  • main.rs: 그냥 호출 crypto_publisher 기능 crypto_publisher_5.rs.
  • crypto_publisher_5.rs

메인.rs

crypto_publisher_5.rs:

이 기사가 도움이 되었기를 바랍니다! 읽어 주셔서 감사합니다.

반응형