μμ νκ³ λΉ λ₯Έ μμ€ν μΈμ΄λ‘ λ§λλ νλμ μΈ μΉ
β λ©μΈμΌλ‘ λμκ°κΈ°μ μμλΌλ¦¬ λννλ λ°λͺ¨. Rust(Axum) WebSocket λ°±μλλ‘ μ€μκ° μ μ‘νλ©°, λλ€μμ μ μ IP, μ μ₯Β·λν λ΄μ©μ΄ μλ² νμΌμ κΈ°λ‘λκ³ μ΅κ·Ό 1μκ° λΆλλ§ λ³΄κ΄λ©λλ€.
λΈλΌμ°μ μμ Rust μ½λλ₯Ό μμ±νκ³ μ€ν λ²νΌμΌλ‘ κ²°κ³Όλ₯Ό νμΈνλ λ°λͺ¨. λ¬Έλ² κ°μ‘° μλν°(CodeMirror)λ₯Ό μ 곡νλ©°, μ»΄νμΌ/μ€νμ 곡μ μλλ°μ€(play.rust-lang.org)μμ μμ νκ² μνλ©λλ€.
κΈ°μ΄λΆν° μ€κΈκΉμ§ 6λ¨κ³ λ λ²¨λ³ νμ΅. κ° λ 벨 μνμ ν΅κ³Όνλ©΄ λ€μ λ¨κ³κ° μ΄λ¦¬κ³ , μνμ μΈμ λ μμν μ μμ΅λλ€. μμ μ μ λ ₯ν μ¬μ©μ μ λ³΄λ‘ μ§λΒ·μ μκ° μλ²μ μ μ₯λμ΄ μ΄λ©μΌλ‘ λ€μ μ‘°νν μ μμ΅λλ€.
Rustλ λ©λͺ¨λ¦¬ μμ μ±μ μ»΄νμΌ νμμ 보μ₯νλ©΄μλ C/C++ μμ€μ μ±λ₯μ λ΄λ μμ€ν νλ‘κ·Έλλ° μΈμ΄μ λλ€. κ°λΉμ§ 컬λ ν° μμ΄ μμ κΆ(ownership) λͺ¨λΈλ‘ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ©°, Stack Overflow μ€λ¬Έμμ μλ μ§Έ "κ°μ₯ μ¬λλ°λ μΈμ΄"λ‘ κΌ½ν μμ΅λλ€. μΉ λ°±μλ, WebAssembly(WASM) νλ°νΈμλ, CLI λꡬ, μλ² λλκΉμ§ νλκ² μ°μ λλ€.
Tokio νμ΄ λ§λ λͺ¨λν νλ μμν¬. Tower λ―Έλ€μ¨μ΄ μνκ³μ κΆν©μ΄ μ’μ μ΅κ·Ό νμ€μ²λΌ μ°μ.
μ‘ν° λͺ¨λΈ κΈ°λ°μ μ΄κ³ μ±λ₯ νλ μμν¬. λ²€μΉλ§ν¬ μμκΆ, λκ·λͺ¨ μλΉμ€μ λ€μ μ±ν.
λ§€ν¬λ‘ κΈ°λ°μ μ§κ΄μ API. νμ μμ λΌμ°ν κ³Ό νΌ μ²λ¦¬λ‘ μμ°μ±μ΄ λμ.
λ°μν μ νΈ(signals) κΈ°λ° νμ€ν WASM νλ μμν¬. SSR + νμ΄λλ μ΄μ μ§μ.
// Cargo.toml: axum = "0.7", tokio = { version = "1", features = ["full"] }
use axum::{routing::get, Router};
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(|| async { "π¦ Hello from Rust!" }))
.route("/rust", get(|| async { "pastacoding.com Γ Rust" }));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000")
.await.unwrap();
axum::serve(listener, app).await.unwrap();
}
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcargo new my-web && cd my-webcargo add axum tokio --features tokio/fullcargo run ν http://localhost:3000 μ μrust-lang.org (νκ΅μ΄ μ§μ)
곡μ μ λ¬Έμ "The Rust Programming Language"
Rust ν¨ν€μ§(ν¬λ μ΄νΈ) λ μ§μ€νΈλ¦¬
μμ λ‘ λ°°μ°λ Rust