SpringBoot の新規プロジェクトで意識すること

SpringBoot でアプリケーションを作るとき

私は SpringBoot を利用した Java 開発が一番得意です!今回は、いつも意識している SpringBoot で新規のプロジェクトを生成するときの内容をまとめたいと思います。

当たり前の情報かもしれないですが、何かの参考になれば幸いです。

なお、ライブラりの仕様など細かい解説はしておりません。ある程度ご存知である前提で書かせていただきます。

Spring Initializr

Spring Initializr は、 SpringBoot での開発を始めるとき、必ず利用します。ここでは、どのようなアプリケーションを作る場合でも、私が必ず設定しているフレームワークやライブラリの情報をお伝えします!

気持ちよく開発するためのライブラリ

  • SpringBoot DevTools
  • Lombok

は、気持ちよく(効率よく?)開発することをサポートしてくれると思っています。特に、初めて Lombok と出会ったときは感動しました笑

ちなみに、Lombok を利用している案件を見ることは多いですが、ほとんど全てのクラスに @Data が付与されているのを見ると ムムムッ!! となってしまいますね笑

個人的には immutable を推奨しているので、@Withを利用したいですし、コンストラクタ系のアノテーションにも AccessLevel.PRIVATE を付けてます。

なんだかんだ便利な Spring Web

Spring Web は、RESTful API などを作成するなら必須ですが、バッチプロセスなどの場合は不必要な気がします。ただ、Spring Web と一緒についてくるライブラリに便利なものが多いので、私は Spring Web を必ず入れてます。

不確かな情報で恐縮ですが、 jackson は Spring Web に付いてくるかな。。JSON や CSV のパース処理は、Web API 開発でなくても必要な場面は多いと思います。

また、 RestTemplate が使えるのが良いと思ってます。Java 純正の HttpClient も良いですが、 何となく RestTemplate が使いやすいと思ってます。

Spring Security は、Web API 開発の場合は必須で入れておきます。理由は後から対応すると面倒になるからです笑
最初から SecurityConfig の設定を施しておけば何かと安心かと。

ちなみに、常時起動している必要がないタスク処理などでは、properties に spring.main.web-application-type=none を付与することをお忘れなく。

ORMapper は好み

私はつい最近、やっと JPA と仲良くなれた気がしています。なので、 Spring Data JPA を使うことが多いです。

ただ、 なんだかんだ Spring Data JDBC が良いよね〜という気持ちもわかります笑

ポータビリティ向上のための H2

H2 Database を入れておくことで、開発のポータビリティが向上すると考えています。Embedded な RDB があるだけで、git clone して SpringBoot を起動したら、何となくアプリケーションが動く、という状態を作ることが理想的ですね。

Profiles の活用

Spring の Active Profiles によって、properties を読み替える手法は一般的かと思います。local, dev, stg, prod のように環境ごとに Profile を用意しておく光景はよく見ます。

私は、上記の利用方法だけではなく、依存するサービスを mock 化したい時などに、Profiles を活用することもお勧めしています。

e.g. メッセージキューサービスの mock

Amazon SQS を利用している場合、ローカルPCでの動作確認はどうされているでしょうか?

ElasticMQ など、docker 上で動く代替サービスを利用することも多いと思います。この場合は、application-local.yml(properties) には、ElasticMQ のアドレスを設定するでしょう。

上記でも良いと思いますが、今回はメッセージキューサービス自体を Java で実装し、そのクラスに @Profile("mock-sqs") などを付与する案を紹介します。

Java には Queue を扱える様々なクラスがあります。それをラップしたクラスを作成し、 @Component@Profile("mock-sqs") を付与すれば完成です(端折り過ぎてます...)!

そして、起動時に -Dspring.profiles.active=mock-sqs を付与すれば、自作のキューサービスが利用されます。

なぜこの方式をお勧めするのかというと、

  • 様々な要因でローカルPCに代替サービスを構築できない
  • クラウドサービスの障害時の復旧策として利用できる可能性

を考えているためです。

大切なのはポータビリティとブロックされないこと

10 年ほどの開発経験を通して、アプリケーションのポータビリティの高さが、品質やアジャイルな開発に必要不可欠だと実感しています。

ある有名な かんばん の書籍にも「ブロックされないこと!」と記載がありましたが、自分たちの開発サイクルが他の要因で止まってしまうことは、できる限り避けたいです。

そのため、ポータビリティを向上することで「いつでも、どこでも、開発できるぜ!」という状態を作っておきたいと思ってます。

何かの参考になれば嬉しいです!ありがとうございました。