Spring Bootを始めたばかりの方にとって、最初に戸惑うものの1つが「Starter」ではないでしょうか。 「Starterって何?必要なもの全部入れてくれる魔法の箱?」なんて思った方もいるかもしれません。半分正解です!
Spring Boot Starterは、特定の機能に必要な依存関係をまとめてくれる、非常に便利な仕組みです。具体的に何なのか、どう使うのかを順に説明していきます。

なお本記事の内容は Spring Boot 3.x 系 (3.2 以降を推奨)を前提にしています。Spring Boot 4.x で導入された Starter 名の変更については、記事後半の「この記事の対象バージョンと Starter 名の変更について」で触れます。

Spring Boot Starterとは

Spring Boot Starterは、MavenやGradleといったビルドツールで使用する依存関係の記述を簡素化するために作られています。

例えば、Webアプリケーションを作成する場合、通常であれば、Spring Webモジュール、Servlet API、JSPなど、多くの依存関係を個別にpom.xml (Maven)やbuild.gradle (Gradle)に記述する必要があります。
プロジェクトが大きくなるにつれて管理は煩雑になり、バージョンの不一致や依存関係の衝突といったトラブルも発生しやすくなります。

そこで登場するのが、spring-boot-starter-webなどのStarterです。 Starterは特定のライブラリを示すものではなく、「Spring Bootアプリケーションでよく使われるライブラリ群をまとめたもの」です。spring-boot-starter-webを依存関係として追加するだけで、Spring Web に必要なライブラリを全てプロジェクトに取り込むことができます。

Spring Boot Starterを使った依存関係の追加

例えば、Mavenを使用しているプロジェクトでは、pom.xmlに以下のように記述します。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Gradleを使用している場合も同様で、build.gradleに以下のように記述します。

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

たったこれだけで、Spring MVC、Jackson(JSON処理)、Tomcat(組み込みサーバ)など、Webアプリケーションに必要な主要なライブラリが自動的に追加されます。

Spring Boot Starterの種類

Starterの種類は非常に豊富で、データベースアクセス(spring-boot-starter-data-jpaなど)、セキュリティ(spring-boot-starter-security)、テスト(spring-boot-starter-test)など、様々な機能に対応したStarterが用意されています。
Spring Boot公式のほか、コミュニティ製のStarterもあります(信頼できるStarterかは確認が必要です)。

Spring Initializr (https://start.spring.io/) を利用すれば、必要なStarterを選択してプロジェクトの雛形を簡単に生成できます。

Starter選定で失敗しないための実務ルール

便利だからといってStarterを増やしすぎると、起動時間や設定の複雑さが増えることがあります。
実務では、次のルールで最初の依存関係を絞ると安定します。

  • まずは最小構成で開始する(例: web + actuator + test
  • 使う予定が決まっていないStarterは後から追加する
  • 本番で不要なStarter(開発補助系)はプロファイルや依存スコープを分ける
  • バージョンは個別指定よりSpring Boot BOMの管理に寄せる

「最初から全部入り」にしないことが、トラブルを減らす最短ルートです。

よくあるハマりどころ

1. Starterを入れただけで設定不要だと思ってしまう

Starterは“必要なライブラリを揃える”仕組みであり、業務要件に合わせた設定までは自動ではありません。
例えばSecurity Starterを入れたら、認可ルールや公開エンドポイントを明示的に設計する必要があります。

spring-boot-starter-security を入れると何が起きるか

spring-boot-starter-security は「入れただけで挙動が大きく変わる」代表的な Starter なので、少し詳しく触れておきます。

implementation 'org.springframework.boot:spring-boot-starter-security'

この 1 行を追加して起動すると、次のことが自動で起こります。

  • 全てのエンドポイントが認証必須になる (ブラウザで / を開くとログインフォームにリダイレクトされ、API クライアントからは 401 が返る)
  • ユーザー名 user と、起動ログに出力されるランダムなパスワードでログインできる
  • CSRF 対策やセキュリティヘッダ(X-Content-Type-Options など)が有効になる

「動いていた画面が急にログイン画面になった」と驚く方が多いですが、これは想定どおりの動作です。実際のアプリでは、SecurityFilterChain の Bean を定義して「どのパスを公開し、どのパスに認証を要求するか」を明示的に設計する必要があります。

最小構成での認可ルールの書き方と、application.properties でユーザー名・パスワードを固定する方法は Spring Security でBasic認証を実装する手順 にまとめています。

2. 依存衝突を放置して原因が見えなくなる

手動でバージョンを上書きし続けると、ある日突然起動しなくなることがあります。
依存関係に違和感があるときは、mvn dependency:tree あるいは ./gradlew dependencies で早めに可視化しましょう。

3. 同系統Starterを重複採用してしまう

例えばspring-boot-starter-webspring-boot-starter-webfluxを意図なく混在させると、設計方針がぶれやすくなります。
同期MVCでいくのか、リアクティブでいくのかを先に決めることが重要です。

まず何を入れるべきか迷ったら

学習・小規模APIなら、まずは以下で十分です。

  • spring-boot-starter-web
  • spring-boot-starter-validation
  • spring-boot-starter-test

DBを使うときだけspring-boot-starter-data-jpaを追加し、認証が必要になったらspring-boot-starter-securityを加える、という段階的な追加が運用しやすいです。

それぞれの Starter を実際にどう使うかは、次の記事が入口になります。

よく使うStarter早見表

用途別に、最初に候補に上がるStarterをまとめます。「入れると具体的に何が入るのか」をすぐ確認できるよう、主な内包ライブラリも載せておきます。groupId はいずれも org.springframework.boot なので、座標は org.springframework.boot:<artifactId> の形になります。バージョンは Spring Boot の BOM が管理するため個別指定は不要です。

用途Starter (artifactId)主な内包ライブラリ
すべての Starter の土台spring-boot-starterspring-boot, spring-boot-autoconfigure, spring-boot-starter-logging (Logback), snakeyaml, jakarta.annotation-api
REST APIspring-boot-starter-webspring-boot-starter, spring-web, spring-webmvc, spring-boot-starter-json (Jackson), spring-boot-starter-tomcat
リアクティブ Webspring-boot-starter-webfluxspring-boot-starter, spring-webflux, spring-boot-starter-reactor-netty, spring-boot-starter-json
入力値検証spring-boot-starter-validationspring-boot-starter, hibernate-validator, tomcat-embed-el
RDBアクセスspring-boot-starter-data-jpaspring-boot-starter-jdbc (HikariCP), hibernate-core, spring-data-jpa, spring-boot-starter-aop
認証・認可spring-boot-starter-securityspring-boot-starter, spring-security-config, spring-security-web, spring-aop
監視・ヘルスチェックspring-boot-starter-actuatorspring-boot-starter, spring-boot-actuator-autoconfigure, micrometer-observation, micrometer-core
テストspring-boot-starter-testspring-boot-test, spring-test, JUnit Jupiter, Mockito, AssertJ, Hamcrest, JSONassert, json-path

たとえば spring-boot-starter-web を追加すると、その内側で土台の spring-boot-starter も一緒に取り込まれます。そのため、土台の Starter を 単体で明示的に書く必要はほとんどありません

内包ライブラリの正確な一覧は Spring Boot のバージョンによって変わるため、迷ったら 公式リファレンスの Starter 一覧 を参照してください。また、リアクティブ Web(WebFlux)がどういう場面で向いているかは Spring Boot WebFlux 入門 にまとめています。

Starter と AutoConfiguration の違いは?

初学者が混同しやすいのが、Starter と AutoConfiguration(自動設定)の関係です。役割は明確に分かれています。

  • Starter : 「必要なライブラリを束ねた依存関係のセット」。それ自体にはコードがほぼなく、pom.xml / build.gradle の記述を短くするのが仕事です。
  • AutoConfiguration : 「クラスパスにあるライブラリを見て、Bean を自動登録する仕組み」。spring-boot-autoconfigure が担当し、@ConditionalOnClass などの条件で有効化されます。

spring-boot-starter-web を入れると Tomcat と Spring MVC がクラスパスに載り、それを検知した AutoConfiguration が DispatcherServlet や組み込み Tomcat を自動で構成する、という二段構えです。この仕組みの詳細は Spring Boot の AutoConfiguration の仕組み で解説しています。

Tomcat ではなく Jetty や Undertow を使いたいときは?

spring-boot-starter-web は組み込みサーバとして Tomcat を含みます。別のサーバに差し替えたい場合は、Tomcat の Starter を除外して代替 Starter を追加します。

Maven の場合は次のとおりです。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Gradle の場合は次のとおりです。

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation 'org.springframework.boot:spring-boot-starter-jetty'
}

「Starter は束ねるだけ」なので、このように一部だけ除外して差し替えることができます。

バージョンを書かなくてよいのはなぜ?

Starter の記述にバージョンがないのは、spring-boot-starter-parent(Maven)や Spring Boot の Gradle プラグインが BOM (Bill of Materials) を通じて互換性のあるバージョンを一括管理しているためです。Spring Boot のバージョンを 1 か所で決めれば、Spring Framework・Hibernate・Jackson・Tomcat などの組み合わせは検証済みのものが自動で選ばれます。

個別にバージョンを上書きすると、この整合性が崩れて起動時エラーの原因になりがちです。「バージョンは BOM に任せる」が基本ルールです。

この記事の対象バージョンと Starter 名の変更について

2.x から 3.x へ移行する場合は Java 17 必須化や javaxjakarta 置換などの破壊的変更があるため、Spring Boot 2.x から 3.x への移行ガイド を参照してください。

なお Spring Boot 4.x ではモジュール再編に伴い、Web MVC 向けに spring-boot-starter-webmvc という名称の Starter が導入されています。既存の spring-boot-starter-web が引き続き使えるかどうかは、採用するバージョンの公式リリースノートで確認してください。この記事で扱う「Starter は依存関係を束ねるもの」という考え方自体は、バージョンが変わっても同じです。

依存関係を確認する実践コマンド

「なぜこのライブラリが入っているのか」を把握するには、依存ツリーの確認が有効です。

Maven

./mvnw dependency:tree

Gradle

./gradlew dependencies

依存が肥大化してきたら、不要Starterを削るだけでも起動速度やメンテナンス性が改善することがあります。

まとめ

このように、Spring Boot Starterは、依存関係の管理を簡素化し、開発効率を向上させるための強力なツールです。Spring Bootを学ぶ上で、Starterの理解は必須と言えるでしょう。
ぜひ、色々なStarterを試してみて、その便利さを実感してみてください!

次のステップ

Starter の仕組みを理解したら、次の記事に進むと Spring Boot の「裏側」が見えてきます。