見出し画像

RustのフレームワークRocketを使ってTODOアプリを構築しよう

Rustで簡単にWebアプリを構築できるフレームワーク「Rocket」を知っていますか?このフレームワークはPythonの「Flask」や「Django」のように開発ができ、処理速度も速いのでRustでWebアプリを作りたいという方にとてもピッタリなんです。そこで今回の記事では、Rust、HTML、CSS、Sqliteを使って、Rocketで実際にアプリを作成していきます。

この講座を受講すると下の3つの技術がマスターできます!

  1. RustとRocketで簡単なアプリを構築できる

  2. MVTモデルのアプリを構築できる

  3. Repositoryパターンの実装方法が身につく

前半では、Rocketの基本的な使い方やその強力な機能を紹介し、どんな場面で使うのが適しているのかを詳しく解説します。後半では、実際にTODOアプリを開発からデプロイまでを体験してRustを習得していきます。

Rustを使ったWeb開発に興味がある方は、ぜひこの機会にRocketを使って挑戦してみてください!


Rocketとは

Rocketは使いやすいく直感的にわかりやすいようにAPIを設計されているのが特徴で、Rustの型システムを活かした高度な安全性もあります。以下にRocketの主要な特徴やユースケースについて詳しく説明します。

Rocketの特徴

  1. 直感的なルーティング

    • Rustのマクロを使ってHTTPリクエストに対応する関数を直接定義できるのでルーティングの定義が非常に簡単です。リクエストメソッドやURLパスをマクロで簡単に指定できるので可読性が高い状態で開発を進められます。

  2. 型システムを活用した安全性

    • コンパイルするときにリクエストデータの自動パースやバリデーションRustの強力な型システムを利用してチェックしています。たとえば、フォームデータやJSONリクエストを型に合わせて自動的に解析してくれるので安全なコードを書くことができます。

  3. ステート管理

    • Rocketでは、グローバルなステート(アプリ全体で共有するデータ)を簡単に管理できます。これにより、データベース接続や設定ファイル、認証情報などをアプリ全体で扱いやすくなります。

Rocketのユースケース

  1. 小規模〜中規模のWebアプリ

    • 直感的なルーティングやリクエスト処理の仕組みがあるので非常に簡潔なコードでWebアプリを構築できます。特に小規模なプロジェクトを作成するときに開発者がすぐにフレームワークの使い方を理解し、素早く実装できます。

  2. 高速な開発サイクル:

    • 「迅速に安全なWebアプリを開発すること」をRocketの設計思想としているため、シンプルで読みやすいコードが書きやすいです。そのためチーム開発や初心者にも採用しやすいフレームワークです。

  3. シンプルなWeb API

    • シンプルなAPIを構築するのにも最適です。ルート定義やデータのバリデーションが簡単で、迅速にプロトタイプの開発ができます。


Rocketと他のフレームワークと比較

ちなみにRustで主に使用されているフレームワークを比較した表がこちらになります。

フレームワークの比較表
  • Axum
    Rustの最新フレームワークでTokioベースの非同期処理に特化しています。シンプルかつ柔軟な設計で、ハンドラ関数として非同期関数やミドルウェアを実装しやすいです。また、スケーラブルで拡張性が高いのもいいところです。

  • Actix-Web
    高パフォーマンスな非同期Webフレームワークです。並列処理やWebSocketサポートが優れていて、大規模・高負荷なアプリに最適です。

TODOアプリ開発

ここからは実際に手を動かしてTODOアプリを開発していきます。

アプリ概要

シンプルなTODOリスト管理ツールです。タスクの一覧表示、詳細確認、更新・編集ができます。
一覧画面では全てのTODOを一目で確認でき、詳細画面では個々のタスクの説明や登録日などを確認できます。また、更新画面でタスクの内容を修正できます。

使用技術

  • Rocket(Rust)
    Rustの軽量かつ柔軟なフレームワークであるRocketを使用して、サーバーサイドロジックを構築しています。

  • SQLite
    シンプルで軽量なリレーショナルデータベースであるSQLiteをデータストレージとして採用しています。ローカル環境での手軽にデータ管理できます。

  • Diesel
    データベース接続およびORM(オブジェクトリレーショナルマッピング)には、Rust用の強力なライブラリであるDieselを使用しています。型安全なクエリを通じてデータ操作を効率化しています。

  • UIkit
    フロントエンドのUIにはシンプルで洗練されたデザインと使いやすいコンポーネントを提供するCSSフレームワークのUIkitを使用しています。

MVTモデルで実装

MVTモデル(Model-View-Template)は、Webフレームワークで実装する時によく使われるソフトウェア設計パターンの1つです。特にDjangoのようなWebフレームワークで使用されたりしています。

MVTモデルを使う理由

  • シンプルな構造
    MVTはアプリの構造を整理し、コードの責任分担を明確にします。モデル、ビュー、テンプレートがそれぞれの役割を持つため、開発がしやすくなります。

  • 保守性
    各部分が独立しているため、DBと連携しているモデルがビューやテンプレートの変更に影響を受けにくいのが特徴です。

  • システムを最適化
    MVTモデルは役割が分担されているため効率的にアプリを構築できます。

それぞれ役割に分けてシステムを構築していきます。

全体図

今回実装するファイルをMVTモデルに当てはめると以下のようになります。

実装するMVTのデータの流れ
  1. ユーザーリクエスト
    ユーザーがTODOアプリにアクセスし、ブラウザからサーバーへリクエストを送ります。

  2. ビュー(View)
    サーバーがリクエストに基づいて、必要なデータを取得するためにモデルにアクセスします。

  3. モデル(Model)
    ビューからの要求に応じて、モデルがデータベースであるSQLiteから必要なデータを取り出し、ビューに返します。

  4. ビュー(View)
    ビューは、モデルから受け取ったデータを処理し、それをテンプレートに渡します。

  5. テンプレート(Template)
    テンプレートは、ビューから渡されたデータをHTMLに埋め込み、ユーザーが見るためのウェブページを生成します。

  6. ユーザーにレスポンス
    最後に、テンプレートで生成されたHTMLがユーザーに返され、ブラウザに表示されます。

初期設定

まずはプロジェクトを作成していきます。

フォルダを作成

デスクトップで「cargo」を使ってプロジェクトを作成します。

shell

~/Desktop $ cargo new rust_todo
~/Desktop $ cd rust_todo

ライブラリー設定

Cargo.tomlにrocketを設定します。ここで設定したライブラリはRustプロジェクトのビルド時に依存関係のクレートを自動的にダウンロードし、プロジェクトに含めます。

Cargo.toml

...
[dependencies]
rocket = "0.5.0-rc.3"

main.rsにWebサーバーを構築するコードを記載します。

src/main.rs

#[macro_use]
extern crate rocket;

#[get("/")]
fn index() -> &'static str {
    "Hello world"
}

#[rocket::main]
async fn main() -> Result<(), rocket::Error> {
    let _rocket = rocket::build().mount("/", routes![index]).launch().await?;
    Ok(())
}
  • #[macro_use] extern crate rocket;
    Rocketフレームワークの機能を利用するための宣言です。#[macro_use]で「routes!」などのRocketのマクロを使えるようにしています。

  •  #[get("/")]
    HTTPのGETリクエストを処理するルートハンドラーを定義します。「/」はルートURL(トップページ)に対するリクエストを示しています。

  • fn index() -> &'static str { "Hello world" }
    「/」に来たGETリクエストが場合、関数indexが呼ばれて&'static str型を返しています。今回は「Hello world」を返しています。その結果、トップページにアクセスすると「Hello world」と表示されます。

  • #[rocket::main] async fn main() -> Result<(), rocket::Error>
    #[rocket::main]は非同期のエントリーポイントを定義するマクロです。このmain関数がアプリのエントリーポイントで、非同期の処理を行うためにasyncが使われています。戻り値はResult<(), rocket::Error>で、正常終了ならOk(())、エラーが発生した場合はrocket::Errorが返ります。

  • rocket::build().mount("/", routes![index])
    rocket::build()はRocketのアプリインスタンスを作成します。mount("/", routes![index])は、「/」というURLパスに対してindex関数をルートとしてマウントしています。つまり、トップページにアクセスした際にindex関数が実行される設定です。

  • .launch().await?;
    この部分でアプリを起動します。launch()はRocketのサーバーを起動する非同期関数で、awaitを使ってその結果を待機します。エラーが発生した場合は「?」によってエラーを呼び出し元に伝播します。

  • Ok(())
    アプリが正常に起動した場合、この行でOk(())を返してmain関数を終了します。

実装できたらターミナルで起動させます。

~/Desktop/rust_todo $ cargo run
...
🛡️ Shield:
   >> Permissions-Policy: interest-cohort=()
   >> X-Content-Type-Options: nosniff
   >> X-Frame-Options: SAMEORIGIN
🚀 Rocket has launched from http://127.0.0.1:8000

http://127.0.0.1:8000にアクセスすると「Hello world」というテキストがWeb上に表示されます。

DBセットアップ

dieselのセットアップ

Cargo.tomlにdieselを追加し、sqliteに接続できるようにします。
dieselはRustのORMフレームワークで、型安全なクエリを使用して簡単にデータベース操作できるようにします。SQLiteは組み込み型の軽量なデータベースで、特に小規模なアプリや開発環境で利用されます。dieselとSQLiteを組み合わせることでRustを使って簡単にデータベースの読み書きや管理ができます。

ここから先は

41,575字 / 12画像

¥ 500

サポートよろしくお願いいたします! いただいたサポートの一部ははクリエイターとしての活動費に使わせていただきます! ※ サポートの一部は子供たちの教育などの団体に寄付する予定です。