Rustに入門してみた その1

ふと思い立ってRustを触ってみることにした。

そこまで強い目的意識は無いが、FaaS/サーバーレス環境で起動のオーバーヘッドが少ない言語の選択肢を持っておきたいという気持ちはある。Goも使ってはいるが、いまいち肌に合わないというかフラストレーションが溜まるポイントがいくつかあるので、Rustに目を向けてみたという経緯だ。

とりあえず書籍『実践Rustプログラミング入門』の内容を一通り試すことを目標にした。正直どの本が良いか皆目分からなかったけど、手を動かすこと優先の構成は自分に合っていると思う。

www.shuwasystem.co.jp

環境構築

公式ページのコマンドでRustツールチェインを一発でインストールできる。(Mac OS)

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

はじめに - Rustプログラミング言語

本に記載の通り、 cargo new でプロジェクトを作成して cargo run で実行してみる。なおcargoはRust標準のパッケージマネージャー兼ビルドツールとのこと。ビルドツールがいまいちで乗り換えもできないとその言語を使う気持ちが削がれるが、手軽さ考えると言語標準があったほうが良いとは思う。

$ cargo new hello
     Created binary (application) `hello` package
$ cd hello/
$ cargo run
   Compiling hello v0.1.0 (/~~~/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 4.22s
     Running `target/debug/hello`
Hello, world!

本の指示の通りcargo-editを入れることに。cargo-editはパッケージの追加・削除・アップグレード等をコマンドで実行できるツール。

インストール時に以下の記事と同じ問題が発生したが、opensslをインストールすることで解決。 cargo-editインストール時のエラー

$ brew install openssl
$ cargo install cargo-edit
(中略)
   Installed package `cargo-edit v0.12.2` (executables `cargo-add`, `cargo-rm`, `cargo-set-version`, `cargo-upgrade`)

IDEIntelliJ IDEAにRustプラグインを入れて使うことにした。Ultimateライセンスをすでに持っているのもあるが、Language Serverを入れるのが面倒というのが大きい。(初学者なのに周辺ツールの問題でつまづきたくない)

文法(基本的な型、制御構文)

文法に関しては感想だけ。

  • Tuple, Option, ResultなどScalaとかでよく見たやつがあるのは嬉しい
  • 可変長のリストの名前がVec(ベクタ型)なのはJavaVectorを思い出してしまいちょっとだけ混乱する
  • 固定サイズの値はスタックに格納できるが、可変サイズの場合は Box 型を使って明示的にヒープに置く必要がある。文法レベルでメモリ管理と言った低レイヤのことを意識しないといけない。

今日はここまで。

Spring BootでWebアプリを作るときの第一歩

Spring Bootで初めてWebアプリを作ろうとすると最初につまづくのが「どういうライブラリ組み合わせればええんや…」というポイントなので、自分の中にある選定パターンをメモします。ここで説明するのはWeb層とDBアクセス層をどうするかという部分だけです。

あまり真面目な記事ではないので、ちゃんとした情報を知りたい人はSpring Academyとかを見るのが良いと思います。

マイ・パターン

灰色になっているのは仕事では使ったことのない組み合わせです。

Spring WebFlux + Spring Data R2DBC

Spring初心者は無視して良いです。自分も使ったことがあるのはDBアクセスなしのWebFluxだけです。 Microservicesで言うところのAPI Gatewayだったりリバースプロキシだったり、特定のユースケースのときしか選択肢に上がりません。

Spring MVC

@Controllerとか@RestControllerとか使ういつものアレです。なお「Springってアノテーションだらけの奴でしょ?」という発言には「アノテーションレスのSpring Web MVC.fnとかあるが?」というツッコミが飛んでくるらしいです。

Spring JDBC

Springプロジェクトの一つで、JdbcTemplateなどが使えるライブラリです。javax.sqlをラップした程度の機能しかありませんが、Spring本体と何の問題もなく組み合わせることができますし、小規模なPJであればこれで十分というケースは多いです。

Spring Framework 6.1 (Spring Boot 3.2) からはJdbcClientというFluent APIを使うことができて、ちょっとだけおしゃれに書くことができます。

Spring Data JPA

JPA使いたいときはこれ。逆に言うとJPAじゃなくても良いときは選ばないほうが良いです。

Spring Data JPAJPAとしての機能のほか、Repositoryインタフェースに findByUserId(long userId) みたいなメソッドを宣言するとメソッド名から自動的にクエリを生成してくれるという黒魔術が使えます。

Spring Data JDBC

非常に紛らわしいですが、Spring JDBCとは異なります。

出始めの頃に一度触ってみましたが、最近はどうなっているのかあまり詳しくありません。

Spring Data JPAからJPAを抜いたような感じ(?)で、名前のスタンダード感に反して結構クセが強い印象です。

Doma

ここから先はサードパーティライブラリです。

最近よく使ってるやつ。元Seasarプロジェクトらしく、SQLテンプレートを書くことができます。 カラムの値をドメインと呼ばれるJavaオブジェクトとして扱えるのが大きな特徴です。(例えば、Eメールアドレスを EmailAddress クラスのオブジェクトのまま扱ったり、区分値をEnumのまま扱ったり)

ビルド時にDaoインタフェースの実装クラスを自動生成するので、それに抵抗感がなければ結構おすすめです。

MyBatis

SQLを直接かけるやつ第2弾。

こちらは.sqlファイルではなくXMLファイルにSQLを書きます。(なので">"をエスケープしなければならないのが若干面倒)XMLの設定は柔軟で割りと何でもできますが、やりすぎるとXML地獄になるので注意。

ネット上の情報量が多く、コードジェネレーターなどの周辺ツールも充実しているので安牌と考える人は多いと思います。

まとめ

きちんと比較検討したい人は多田さんのスライドを読むのが良いと思います。今読んでも参考になります。

Java ORマッパー選定のポイント #jsug | ドクセル

DBアクセス周りはR2DBCなどを除いて枯れ気味の分野なので、たぶんしばらくはこのパターンから変わることはないんじゃないかなあ。