λΈ”λ‘œκ·Έ 주인

μ „μ„±ν›ˆμ΄λ‹€.

λΈ”λ‘œκ·Έλ₯Ό μ‹œμž‘ν•˜λŠ” 이유

κΈ€μ“°κΈ°λ₯Ό μ—°μŠ΅ν•˜κ³ , λ‚΄ κ²½ν—˜κ³Ό 생각을 λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ λ‚˜λˆ„λ €κ³  ν•œλ‹€.

λΈ”λ‘œκ·Έλ₯Ό λ§Œλ“  이유

μ†Œν”„νŠΈμ›¨μ–΄ 개발자둜써 ν‰μ†Œμ— ν•™μŠ΅ν•˜κ³  싢은 ν”„λ ˆμž„μ›Œν¬μ™€ μ–Έμ–΄, νˆ΄λ“€μ΄ μžˆμ—ˆλ‹€.

  • 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μ—μ„œ 원본 μ†ŒμŠ€μ½”λ“œλ₯Ό 확인할 수 μžˆλ‹€.

κ°œμ„ ν•  점듀

https://github.com/atjsh/rust-blog/issuesμ—μ„œ 확인할 수 μžˆλ‹€.