λΈλ‘κ·Έ μ£ΌμΈ
μ μ±νμ΄λ€.
λΈλ‘κ·Έλ₯Ό μμνλ μ΄μ
κΈμ°κΈ°λ₯Ό μ°μ΅νκ³ , λ΄ κ²½νκ³Ό μκ°μ λ€λ₯Έ μ¬λμκ² λλλ €κ³ νλ€.
λΈλ‘κ·Έλ₯Ό λ§λ μ΄μ
μννΈμ¨μ΄ κ°λ°μλ‘μ¨ νμμ νμ΅νκ³ μΆμ νλ μμν¬μ μΈμ΄, ν΄λ€μ΄ μμλ€.
- Rust lang - νλ‘κ·Έλλ° μΈμ΄
- axum - Rust κΈ°λ° μΉ νλ μμν¬
- AWS Lambda - μ»΄ν¨ν μΈνλΌμ€νΈλμ³
- PostgreSQL - DB
- SvelteKit - Svelte κΈ°λ° μΉ νλ μμν¬
- Cloudflare Pages - λ¬΄λ£ μΉ νΈμ€ν μλΉμ€
- Supabase - BaaS & λ¬΄λ£ PostgreSQL νΈμ€ν μλΉμ€
μ΄κ²λ€μ μ΅λ¨μκ°μ νμ΅ν λ°©λ²μ μμκΉ κ³ λ―Όνλ€κ°, μ΄κ²λ€λ‘ λ΄ μ μ© λΈλ‘κ·Έλ₯Ό νλ λ§λ€λ©΄ μ’μ κ² κ°λ€κ³ μκ°νλ€. κ·Έλ¬λ©΄ νμ΅λ λκ³ , νμμ νμνλ λ΄ μ μ© λΈλ‘κ·Έ νλ«νΌλ λ§λ€ μ μμΌλκΉ λνν λ μ΄λμ΄μλ€. μ€μ λ‘ λΈλ‘κ·Έλ₯Ό λ§λ€ λ μ κΈ°μ λ€μ μ λΆ μ¬μ©νλ€.
κΈ°μ μ νΉμ§
λ°±μλ λΆλΆμ Rust μΈμ΄λ‘ ꡬννλ€. axum μΉ νλ μμν¬λ₯Ό μ¬μ©νμΌλ©°, λ°°ν¬λ AWS Lambda μΈνλΌμ λμ΄ μλ€.
λ°μ΄ν°λ PostgreSQL λ°μ΄ν°λ² μ΄μ€μ μ μ₯λλ©°, Supabaseμμ 무λ£λ‘ μ 곡νλ μΈμ€ν΄μ€ μμ μ μ₯λλ€. κ°μΈ λΈλ‘κ·Έμ©μΌλ‘λ μΆ©λΆν λλν μ κ°μ 보μλ€.
νλ‘ νΈμλλ SvelteKit νλ μμν¬λ‘ ꡬννμλ€. SSRμ μ κ·Ήμ μΌλ‘ νμ©νλ€. μ μ κ° μνΈμμ©νλ λλΆλΆμ μ½λλ SvelteKitμ μλ² μ½λλ‘ κ΅¬νλμ΄ μμΌλ©°, μΉ λΈλΌμ°μ κΉμ§ λ ΈμΆλμ§ μλλ€. formλ λ§μ°¬κ°μ§μ΄λ©°, form κ²μ¦ λν μλ² λΆλΆμμ μ΄λ£¨μ΄μ§λ€. νλ‘ νΈμλ μ½λλ Cloudflare Pagesμ λ°°ν¬λμ΄ μλ€.
λΈλ‘κ·Έλ₯Ό λ§λ€λ©° λ§λ λκ΄λ€
Cloudflare Pagesμ Vercel, SvelteKit
νλ‘ νΈμλ λ°°ν¬μ μ΄μκ° νλ μμλ€. μ¬μ€μ νλ‘ νΈμλλ₯Ό Vercelμ λ°°ν¬νκ³ λλ΄λ €κ³ νμλλ°, Vercelμ λ°°ν¬νκ³ λ³΄λ μλ²κ° μκ°λ³΄λ€ λλ¦° κ²μ΄μλ€. μ²μμλ AWS Lambdaμ λ°°ν¬λ λ°±μλμ Supabaseμ PostgreSQLμ μμ¬νμλλ°, μ μ λ‘컬μμ Lambda μλ²λ₯Ό νΈμΆν λμλ μλκ° νλλ λλ¦¬μ§ μμ μ μ΄ μ΄μνλ€.
κ·Έλμ νλ‘ νΈμλ λ°°ν¬ μμΉλ₯Ό λ°κΎΈκΈ°λ‘ κ²°μ νλ€. ν보ꡰμ λ§μ§ μμλ€. Netifly, Cloudflare Pages, Vercel μ μ€ νλλ₯Ό κ³ λ₯΄κ±°λ, AWS μΈνλΌμ λ΄κ° μ§μ λ°°ν¬νλ λ°©λ²μ νν΄μΌ νλ€. νΉν SSRμ μ κ·Ή νμ©νλλ‘ κ΅¬νλ μ½λλ‘μ¨λ μ μ λΉλλ μ΄λ €μ΄ μν©μ΄μκΈ° λλ¬Έμ, μ μ€μμ κ³ λ₯΄μ§ λͺ»νλ©΄ λ΄κ° μ§μ SvelteKitμ λ°°ν¬ν΄μΌ νλ μμ μ μ§νν΄μΌ νμ κ²μ΄λ€.
κ·Έλ°λ° κ·Έ μμ€μ Cloudflareμ λμ보λ μΈνλΌμ μ₯μ κ° λ°μνλ€. νν Cloudflare Pagesμ μ ν리μΌμ΄μ μ λ°°ν¬ν΄λ³Ό λ λ°μν΄μ, μ λλ‘ λ ν μ€νΈλ₯Ό μ²μμλ ν μ μμλ€. μ΄ν μ λ κΈ°λ€λ¦¬λκΉ μ₯μ κ° ν΄κ²°λ λͺ¨μμΈμ§, μ μμ μΌλ‘ λ°°ν¬ν΄λ³Ό μ μμλ€.
λ€ννλ Cloudflare Pagesλ 무λν μ±λ₯μ λ½μμ£Όλ κ²μ νμΈν μ μμλ€. νΉν, μ΄μ μ Cloudflare Pagesμ 리μ‘νΈ μ±μ λ°°ν¬ν΄λ³Έ μ μ΄ μμκΈ° λλ¬Έμ, SvelteKit μ± λ°°ν¬ λν μ΄λ ΅μ§ μμλ€. λ€λ§, μλλ νλ‘ νΈμλ ν¨ν€μ§ 맀λμ λ‘ bunμ μ¬μ©νκ³ μμλλ°, SvelteKitμ bunμ μ¬μ©ν λΉλ μ΅μ μ΄ μ‘΄μ¬νμ§ μμ bun μ¬μ©μ ν¬κΈ°νλ μΌμ΄ μμλ€. λμ€μ bun μ§μμ΄ μΆκ°λλ©΄ λ€μ μ¬μ©ν΄λ³Ό μν₯μ΄ μλ€.
λ°°ν¬ μ체λ λ°λ‘ μ§ννμΌλ Cloudflare Pagesμ λ°°ν¬λ ν μ±μ΄ '500 μλ¬'λ₯Ό λ΄λ©° μλνμ§ μλ νμμ΄ λ°μνλ€. SSRκΉμ§λ μλνλ λ΄λΆ λ‘μ§ μ΄λκ°μμ μλνμ§ μλ λͺ¨μμ΄μλ€. λΆμν΄λ³Έ κ²°κ³Ό, Cloudflare Pagesμ js μ€ν νκ²½(Cloudflare Workers)μ λ¬Έμ μΈ κ²μΌλ‘ νμΈλμλ€. fetch ν¨μμ μΌλΆ κΈ°λ₯μ΄ μ§μλμ§ μμ μλ²(λ°±μλ, AWS Lambda)λ‘λΆν°μ λ°μ΄ν° λ‘λ©μ μ€ν¨νλ κ²μ΄μλ€. κ·Έλμ fetch ν¨μ νΈμΆ μ λΆνμν μ½λλ₯Ό μμ νλλ°, κ·Έλ¬λλ μ μλνλ€. λΉμ μμ 컀λ°
Rust & AWS Lambda
AWS Lambdaλ‘ λ°°ν¬νκ³ λλ©μΈ μ£Όμλ₯Ό ν λΉνλ μμ μ Mini Dice μλΉμ€λ₯Ό ꡬνν΄λ³΄λ©° μ΄λ―Έ ν΄λ³Έ μμ μ΄λΌ λ³λ‘ μ΄λ ΅μ§ μμλ€. μ΄ λΉμμλ AWS Lambdaλ‘ λ°°ν¬νκ³ API Gateway(HTTP)λ₯Ό ν΅ν΄ μΈλΆμ μ κ·Όν μ μλλ‘ μ€μ νμλλ°, λμΌν λ°©μμΌλ‘ μ€μ νλ μ΄λ ΅μ§ μκ² λλ©μΈ μ°κ²°κΉμ§ μ§νν μ μμλ€. μ°Έκ³ λ‘ λλ©μΈμ AWS Route 53μ ν΅ν΄ κ΄λ¦¬λκ³ μμκΈ°μ μμ μ΄ λ μ¬μ λ€.
AWS Lambdaμ©μΌλ‘ axumμ λΉλνλ κ³Όμ λν μ΄λ ΅μ§ μμλ€. AWSμμ μ§μ μ 곡νλ `lambda_http` rust crateλ₯Ό μ¬μ©νλ©΄ μΌλ° axum μ±μ²λΌ μ½λλ₯Ό μμ±νκ³ AWS Lambdaμ λ°°ν¬ν μ μλ€. λ‘컬 ν μ€νΈ λν μ½λ λ³κ²½μμ΄ `cargo lambda watch` λͺ λ Ήμ΄λ‘ μ§νν μ μμλ€. μκ°λ³΄λ€ νΈν΄μ λλλ€.
첫 λ²μ μ λ§λ€κ³ μ λλ μ
κΈ°λΆμ΄ μ’μλ€. κ·Έλ¦¬κ³ Rust μΈμ΄λ‘ λ λ§λ€μ΄λ³Έ μ μ΄ ν λ²λ μμλλ°, μΉ μ ν리μΌμ΄μ μ νλ λ§λ€μ΄λ³΄λ Rustμ λν μμ κ°μ΄ μκ²Όλ€ (μλλ 무μμ λ€). λμ€μλ λ 볡μ‘ν μ±μ λ§λ€μ΄λ³Ό μκ°μ΄λ€. μμ μΈκΈν Mini Dice μλΉμ€λ₯Ό Rustλ‘ ν¬ν ν΄λ³΄λ κ²λ μ¬λ°μ κ² κ°λ€. SvelteKit λν μ μ νκ³ λ λ ν λλμ΄ λ€μ΄ λμμ§ μμλ€. CSS μ§μμ΄ λ΄μ₯λμ΄ μκ³ μ΄λ ΅μ§ μμ μ’μλ€. νμ μ§μ λν κ΅μ₯ν μ λμ΄μλ κ²μ λλλ€. μμ¬μ΄ λΆλΆμ΄ λ§μ§ μμλ€. λ¬Όλ‘ μλ° κ² ν₯κΈ° μμΌλ‘ μ¨λ³Έ μνμ΄κΈ΄ νμ§λ§, Svelteμ κΈ°λ³Έμ μΈ ν νλ¦Ώ λ¬Έλ²κ³Ό λ°μ΄ν° λ°μΈλ©μ μ¨λ³Ό μ μμ΄μ μ’μλ€.
μ΄νμλ μ½λ μ 리μ λμμΈ κ°μ , κ·Έλ¦¬κ³ κ΄λ¦¬μ νμ΄μ§ κ°μ μ νμ¨λ³Ό μκ°μ΄λ€. νμ¬ μμ€μ½λ μ 체μ μΌλ‘ μ½λ μ€λ³΅μ΄ μ¬ν νΈμ΄λ€. λΉμ¦λμ€ λ‘μ§μ ν¨μννμ§ μκ³ μ¬κΈ°μ κΈ°μ κ°μ Έλ€ μ¨μ λ°μν λ¬Έμ μΈλ°, μκ³ μλ λμμΈ ν¨ν΄λ€μ μ μ©ν΄μ μ΄λ₯Ό ν΄κ²°ν΄λ³΄λ €κ³ νλ€. νμμλ NestJSμ DI μμ€ν μ μΉμν΄μ Έ μμλλ°, DI μμ€ν μμ΄ λ°±μλλ₯Ό μ§λ³Έ κ²μ΄ μ€λλ§μ΄λΌ μ½λ μ€λ³΅μ΄ λ μ¬ν κ²½ν₯μ΄ μλ κ² κ°λ€. μ½λλ₯Ό 리ν©ν λ§νλ©° λμμΈ ν¨ν΄μ λ€μ λμλ³Ό κΈ°νλ₯Ό κ°μ§ μ μμ κ² κ°λ€. λμμΈμ μ΅λν μ¬ννκ² κ°μ Έκ°κ³ , κ΄λ¦¬μ νμ΄μ§λ λ΄κ° νΈν λ°©ν₯μΌλ‘ λμμΈνλ©΄ λλκΉ ν° λ¬Έμ λ μλλ€.
μ°Έκ³ λ‘ κ΄κ³ λ μμ§ λ¬ μκ°μ΄ μμΌλ©°, ν΅κ³/μ μ μΆμ κΈ°λ₯ λν μμ§ μκ°μ΄ μκ³ , λκΈ κΈ°λ₯λ μμ§μ μκ°μ΄ μλ€. κ·Έλ°λ° λκΈμ ꡬνμ΄ μ¬μ΄ νΈμΌν λ°, νμνλ©΄ ꡬνν μκ°μ μλ€. μ, λμ μΉμ¬μ΄νΈμ λ€ν¬ λͺ¨λλ κΌ λ£κ³ μΆλ€. λ΄κ° λ€ν¬ λͺ¨λ μ€λ μλΌ κ·Έλ λ€.
μμ€μ½λ
https://github.com/ATJSH/rust-blog
μμ μλ³Έ μμ€μ½λλ₯Ό νμΈν μ μλ€.