Spring Bootのディレクトリ構成と役割とは?初心者でもわかる完全ガイド
新人
「先輩、Spring Bootでプロジェクトを作ったんですが、ディレクトリ構成がいろいろあってよくわかりません…。それぞれのフォルダって何のためにあるんですか?」
先輩
「良い質問だね!Spring Bootのディレクトリ構成を理解しておくと、開発がぐっと楽になるんだ。今回は各ディレクトリの役割と配置についてわかりやすく説明するよ。」
新人
「お願いします!どのフォルダに何を入れればいいのか知りたいです!」
先輩
「それじゃあ、基本的なディレクトリ構成から順番に見ていこう!」
1. Spring Bootのディレクトリ構成とは?
Spring Bootのプロジェクトは、効率的にアプリケーションを開発できるように標準的なディレクトリ構成が採用されています。この構成を理解することで、ファイルの配置場所に迷わず、チーム開発でもスムーズに作業できます。
PleiadesでSpring Bootプロジェクトを作成すると、以下のようなディレクトリ構成になります。
spring-boot-demo/
├── .gradle/
├── build/
├── gradle/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── demo/
│ │ │ ├── DemoApplication.java
│ │ │ └── controller/
│ │ │ └── HelloController.java
│ │ ├── resources/
│ │ ├── static/
│ │ ├── templates/
│ │ └── application.properties
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── demo/
│ └── DemoApplicationTests.java
├── build.gradle
└── settings.gradle
この構成は、開発効率と保守性を考慮して設計されています。次のセクションで、それぞれのディレクトリがどんな役割を持っているのかを詳しく解説していきます。
2. 各ディレクトリが何のためにあるのか?
Spring Bootプロジェクトの各ディレクトリには、特定の目的があります。役割を理解することで、正しい場所にコードやリソースを配置できるようになります。
2.1 src/main/java
アプリケーションのメインソースコードを置く場所です。ここには、コントローラ、サービス、リポジトリ、エンティティクラスなどが配置されます。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "こんにちは、Spring Boot!");
return "hello";
}
}
上記のように、controllerパッケージにはユーザーリクエストを処理するクラスを置きます。
2.2 src/main/resources
アプリケーションで使用するリソース(HTMLテンプレート、設定ファイル、静的コンテンツ)を格納します。
- static/:CSS、JavaScript、画像ファイルを配置します。
- templates/:Thymeleafなどのテンプレートエンジンで使用されるHTMLファイルを置きます。
- application.properties:アプリケーションの設定を記述するファイルです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello Page</title>
</head>
<body>
<h1 th:text="${message}">メッセージがここに表示されます</h1>
</body>
</html>
2.3 src/test/java
アプリケーションのテストコードを配置します。テストはアプリケーションの品質を保つために重要です。
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
System.out.println("テストが正常に実行されました");
}
}
2.4 build.gradle と settings.gradle
- build.gradle:依存関係やビルド設定を管理するファイルです。
- settings.gradle:プロジェクト全体の設定を定義します。
plugins {
id 'org.springframework.boot' version '3.1.2'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2.5 .gradle/ と build/
- .gradle/:Gradleビルド時に生成されるキャッシュファイルを格納します。
- build/:コンパイル後のクラスファイルや生成物がここに出力されます。
各ディレクトリの役割を理解することで、無駄なエラーを減らし、より効率的に開発が進められます。次の記事では、これらのディレクトリを実際に活用して簡単なWebアプリケーションを作成する方法を解説します。
3. 各ディレクトリの詳細な役割(src/main/java、resources、test など)
前回の説明でSpring Bootプロジェクトの基本的なディレクトリ構成を紹介しましたが、このセクションでは各ディレクトリの役割をさらに詳しく解説します。各フォルダの目的を理解することで、プロジェクトの可読性や保守性が向上します。
3.1 src/main/java の役割
src/main/javaは、アプリケーションのメインソースコードを格納する場所です。このディレクトリ内で、機能ごとにパッケージを分けて整理することが推奨されます。
- controller:ユーザーからのリクエストを受け取る部分。ルーティングや画面遷移を担当。
- service:ビジネスロジックを担当。データ処理や計算など、アプリケーションの中心的な処理を行います。
- repository:データベースとのやり取りを担当。JPAなどを使用してデータの永続化を実現。
- entity:データベーステーブルに対応するクラスを格納。データ構造を定義します。
src/main/java/com/example/demo/
├── DemoApplication.java
├── controller/
│ └── HelloController.java
├── service/
│ └── HelloService.java
└── repository/
└── HelloRepository.java
3.2 src/main/resources の役割
src/main/resourcesは、アプリケーションで使用する各種リソースを配置するディレクトリです。
- static/:静的リソースを格納。例:画像、CSS、JavaScriptなど。
- templates/:Thymeleafなどのテンプレートファイルを配置。画面表示に使われます。
- application.properties:アプリケーション全体の設定ファイル。ポート番号やDB接続情報などを管理。
src/main/resources/
├── static/
│ └── style.css
├── templates/
│ └── hello.html
└── application.properties
3.3 src/test/java の役割
src/test/javaは、アプリケーションのテストコードを格納する場所です。ここでは、ユニットテストや統合テストを行い、アプリケーションの品質を保証します。
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
System.out.println("テストが正常に実行されました");
}
}
上記のテストコードは、アプリケーションが正しく起動できるかどうかを確認します。
4. コントローラ、サービス、リポジトリの配置場所とその理由
Spring Bootでは、Model-View-Controller(MVC)パターンに基づいてファイルを配置することが推奨されています。これにより、コードの可読性や保守性が向上します。
4.1 コントローラの配置と役割
controllerパッケージは、ユーザーからのリクエストを受け取り、適切な処理へ振り分ける役割を持ちます。
package com.example.demo.controller;
import com.example.demo.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
private final HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", helloService.getGreeting());
return "hello";
}
}
このコードでは、リクエストを受け取り、HelloServiceで処理した結果をHTMLテンプレートに渡しています。
4.2 サービスの配置と役割
serviceパッケージは、アプリケーションの中心となるビジネスロジックを処理します。
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
public String getGreeting() {
return "こんにちは、Spring Bootのサービス層からのメッセージです!";
}
}
サービス層を設けることで、コントローラからロジックを分離し、コードの再利用性とテストのしやすさが向上します。
4.3 リポジトリの配置と役割
repositoryパッケージは、データベースとのやり取りを担当します。Spring Data JPAを使用する場合、インターフェースを作成するだけで簡単に実装可能です。
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
このように@Repositoryをつけたインターフェースを作成すると、自動的に基本的なCRUD操作が可能になります。
5. 実際のディレクトリ構成例とその解説
実際のプロジェクトでは、次のようなディレクトリ構成になります。
spring-boot-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── HelloController.java
│ │ │ ├── service/
│ │ │ │ └── HelloService.java
│ │ │ ├── repository/
│ │ │ │ └── UserRepository.java
│ │ │ └── entity/
│ │ │ └── User.java
│ │ ├── resources/
│ │ │ ├── templates/
│ │ │ │ └── hello.html
│ │ │ └── application.properties
│ └── test/
│ └── java/com/example/demo/
│ └── DemoApplicationTests.java
├── build.gradle
└── settings.gradle
各ディレクトリのポイントは次の通りです。
- controller/:ルーティングと画面遷移を管理。
- service/:ビジネスロジックを実装。
- repository/:データベース操作を担当。
- entity/:データモデルを定義。
- resources/templates/:HTMLテンプレートを格納。
- resources/application.properties:アプリケーションの設定ファイル。
このように役割ごとにディレクトリを整理することで、プロジェクトが大きくなっても迷わず開発を進められます。
6. Pleiadesでの実際のプロジェクト作成手順と注意点
Pleiadesを使用すると、Spring Bootプロジェクトを簡単に作成できます。ここでは、Gradleを使用したプロジェクト作成の手順を詳しく説明します。
6.1 Pleiadesでのプロジェクト作成手順
- Pleiadesを起動します。
- メニューから「ファイル」→「新規」→「Gradleプロジェクト」を選択します。
- プロジェクト名を入力し(例:
spring-boot-demo)、次へをクリックします。 - 「使用するGradleバージョン」を指定し、「Javaバージョン」を選択します。
- 「依存関係の追加」画面で「Spring Web」にチェックを入れます。
- 「完了」をクリックすると、プロジェクトが作成されます。
6.2 注意点
- Javaバージョン:Pleiadesの設定で指定するJavaバージョンがシステムにインストールされていることを確認してください。
- 依存関係の管理:
build.gradleファイルで依存関係が正しく追加されているか確認しましょう。 - プロジェクトのビルド:作成後は「Gradle Tasks」ビューから
buildを実行して、プロジェクトが正常にビルドされるか確認します。
7. コントローラを作成してアプリケーションを実行してみよう(実践編)
実際にコントローラクラスを作成し、Spring Bootアプリケーションを実行してみましょう。
7.1 コントローラ作成手順
src/main/java/com/example/demo/配下にcontrollerフォルダを作成します。- フォルダ内に
HelloController.javaを作成し、以下のコードを記述します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "こんにちは、Spring Bootアプリケーション!");
return "hello";
}
}
7.2 テンプレートファイルの作成
src/main/resources/templates/にhello.htmlを作成します。- 以下のHTMLコードを記述します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello Page</title>
</head>
<body>
<h1 th:text="${message}">ここにメッセージが表示されます</h1>
</body>
</html>
7.3 アプリケーションの実行
DemoApplication.javaを右クリックして「実行」→「Spring Bootアプリケーション」を選択します。- ブラウザで
http://localhost:8080/helloにアクセスすると、メッセージが表示されます。
実行結果
こんにちは、Spring Bootアプリケーション!
8. 各ディレクトリを活用したプロジェクト構成のベストプラクティス
Spring Bootでの開発をより効率的に進めるために、ディレクトリ構成のベストプラクティスを紹介します。
8.1 標準的なディレクトリ構成
spring-boot-demo/
├── src/
│ ├── main/
│ │ ├── java/com/example/demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── HelloController.java
│ │ │ ├── service/
│ │ │ │ └── HelloService.java
│ │ │ ├── repository/
│ │ │ │ └── UserRepository.java
│ │ │ └── entity/
│ │ │ └── User.java
│ │ ├── resources/
│ │ │ ├── templates/hello.html
│ │ │ └── application.properties
│ └── test/java/com/example/demo/
│ └── DemoApplicationTests.java
├── build.gradle
└── settings.gradle
8.2 ベストプラクティスのポイント
- controller、service、repository、entityの分離:役割ごとにフォルダを分けることでコードの見通しが良くなります。
- resourcesフォルダの適切な使用:静的リソースとテンプレートを適切に配置してメンテナンス性を向上させましょう。
- テストコードの充実:
src/test/javaにテストを配置し、品質を確保します。 - 設定ファイルの管理:
application.propertiesで環境ごとに設定を分けると便利です。
8.3 実装例
HelloService.java
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
public String getGreeting() {
return "サービス層からのメッセージです!";
}
}
User.java
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
// ゲッター・セッター
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
8.4 実行と確認
DemoApplication.javaを実行します。- ブラウザで
http://localhost:8080/helloにアクセスし、メッセージが表示されることを確認してください。
ブラウザ出力例
サービス層からのメッセージです!
このように、各ディレクトリを活用することで、プロジェクトの構造が整理され、開発効率が大幅に向上します。