Spring Bootの「templates」や「static」ディレクトリはルートなのか?

こんにちは。ゆうせいです。

Spring BootでWebアプリケーションを作るとき、「templates」や「static」というフォルダをresourcesの下に配置しますよね。では、これらのディレクトリはプロジェクトのルートと見なしてよいのでしょうか?

結論からいうと、アプリケーションのルートではないが、 Spring BootのWebリソース解決において特別な扱いを受ける「ルート的な場所」である、というのが正確な理解になります。

順を追って詳しく説明していきますね!


Spring Bootにおける「ルート」の意味とは?

ここでまず「ルート」という言葉の意味をはっきりさせましょう。
プロジェクトのルート(root)には少なくとも2つの観点があります:

1. ファイルシステム上のルート

これは通常、pom.xml(Maven)やbuild.gradle(Gradle)がある最上位ディレクトリのこと。開発者が見る「プロジェクトのトップ」です。

2. アプリケーションのルート(リソース解決ルート)

Spring BootがHTMLファイルや画像、JS、CSSなどの静的ファイルを探しに行く起点ディレクトリを指します。


templatesstaticの位置づけ

Spring Bootでは、以下のような特別な意味を持つディレクトリがあります:

ディレクトリ説明
src/main/resources/templatesThymeleafやFreemarkerなど、テンプレートエンジンがHTMLテンプレートを探す場所
src/main/resources/staticCSS、JS、画像などの静的ファイルを配置する場所(/css/**, /js/** などでアクセス可能)

つまりどういうこと?

たとえばstatic配下にimg/logo.pngがある場合、
ブラウザからは /img/logo.png でアクセスできます。

このときSpring Bootは「static」フォルダをアプリケーションルートのように扱うので、見た目には「staticがルート」に見えるのです。


例え話:お店と倉庫の関係で考える

Spring Bootアプリを「お店」と考えてみましょう。

  • 「static」ディレクトリは、お客さんが自由に手に取れるショーケース
  • 「templates」ディレクトリは、注文を受けて裏でこっそり用意する厨房

どちらも「お店の入り口」からアクセスされるわけですが、倉庫(resources)全体から見ると一部分にすぎません。


メリット・デメリット

メリット

  • Spring Bootが自動でマッピングしてくれるため、特別な設定が不要。
  • ディレクトリ構成が標準化されており、他人が見ても分かりやすい。

デメリット

  • statictemplates以外に置くと基本的には自動で読み込まれない。
  • 柔軟性に欠けることもあり、独自構成にしたい場合は設定が必要。

補足:Spring Bootのリソース探索順序

Spring Bootは以下の順でリソースを探します:

/META-INF/resources/
/resources/
/static/
/public/

これらはすべて src/main/resources 以下に配置するのが一般的です。
これらのどこにファイルを置いてもOKですが、staticが推奨です。


今後の学習の指針

Spring Bootの「自動構成」(AutoConfiguration)や「WebMvcConfigurer」を学ぶことで、
この仕組みがどう動いているかより深く理解できるようになります。

以下のトピックを次に学ぶとよいでしょう:

  • Spring BootのWebMvcAutoConfigurationの仕組み
  • addResourceHandlers()メソッドの使い方
  • テンプレートエンジン(Thymeleafなど)のカスタマイズ方法
  • application.propertiesによるパスの変更方法(例:spring.web.resources.static-locations

ほかにも疑問があれば、何でも聞いてくださいね!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。