Skip to content

フォルダ構成

📁 Spring Bootプロジェクトのフォルダ構成

Section titled “📁 Spring Bootプロジェクトのフォルダ構成”

Spring Bootプロジェクトのフォルダ構成は、MavenGradleの標準的な構造に基づいており、開発者がファイルを探しやすく、アプリケーションの役割を理解しやすくなるよう設計されています。

my-app/
├── src/
│ ├── main/
│ │ ├── java/ # Javaソースコード
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── myapp/
│ │ │ ├── MyAppApplication.java # メインクラス
│ │ │ ├── controller/ # コントローラー層
│ │ │ │ └── UserController.java
│ │ │ ├── service/ # サービス層
│ │ │ │ └── UserService.java
│ │ │ ├── repository/ # リポジトリ層
│ │ │ │ └── UserRepository.java
│ │ │ ├── model/ # エンティティ/モデル層
│ │ │ │ └── User.java
│ │ │ ├── dto/ # データ転送オブジェクト
│ │ │ │ └── UserDTO.java
│ │ │ ├── config/ # 設定クラス
│ │ │ │ └── DatabaseConfig.java
│ │ │ ├── exception/ # 例外クラス
│ │ │ │ └── ResourceNotFoundException.java
│ │ │ └── util/ # ユーティリティクラス
│ │ │ └── DateUtil.java
│ │ └── resources/ # リソースファイル
│ │ ├── application.properties # アプリケーション設定
│ │ ├── application-dev.properties # 開発環境設定
│ │ ├── application-prod.properties # 本番環境設定
│ │ ├── static/ # 静的リソース(CSS、JS、画像)
│ │ ├── templates/ # テンプレートファイル(Thymeleafなど)
│ │ └── db/
│ │ └── migration/ # データベースマイグレーション(Flyway/Liquibase)
│ │ └── V1__init.sql
│ └── test/ # テストコード
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── myapp/
│ │ ├── MyAppApplicationTests.java
│ │ ├── controller/
│ │ ├── service/
│ │ └── repository/
│ └── resources/
│ └── application-test.properties
├── target/ # Mavenのビルド出力(自動生成)
├── pom.xml # Mavenの設定ファイル
└── README.md

アプリケーションのメインソースコードを格納します。

パッケージ構造の例:

com.example.myapp/
├── MyAppApplication.java # Spring Bootアプリケーションのエントリーポイント
├── controller/ # REST APIエンドポイントを定義
├── service/ # ビジネスロジックを実装
├── repository/ # データアクセス層
├── model/ # エンティティクラス
├── dto/ # データ転送オブジェクト
├── config/ # 設定クラス
├── exception/ # カスタム例外
└── util/ # ユーティリティクラス

アプリケーションの設定ファイルや静的リソースを格納します。

application.propertiesの例:

# サーバー設定
server.port=8080
server.servlet.context-path=/api
# データベース設定
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=org.postgresql.Driver
# JPA設定
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# ロギング設定
logging.level.com.example.myapp=DEBUG
logging.level.org.springframework.web=INFO

テストコードを格納します。メインソースコードと同じパッケージ構造を維持します。

テストクラスの例:

@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void testFindUser() {
// テストコード
}
}

Spring Bootアプリケーションは、通常、レイヤードアーキテクチャに基づいて構成されます。

HTTPリクエストを受け取り、レスポンスを返す層です。

@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
UserDTO user = userService.findById(id);
return ResponseEntity.ok(user);
}
}

ビジネスロジックを実装する層です。

@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public UserDTO findById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User", id));
return convertToDTO(user);
}
private UserDTO convertToDTO(User user) {
// 変換ロジック
}
}

データアクセスを担当する層です。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String name);
}

エンティティクラスを定義する層です。

@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
// getter/setter
}

環境ごとに異なる設定を使用する場合、application-{profile}.propertiesという命名規則を使用します。

resources/
├── application.properties # 共通設定
├── application-dev.properties # 開発環境
├── application-test.properties # テスト環境
└── application-prod.properties # 本番環境

使用例:

Terminal window
# 開発環境で実行
java -jar my-app.jar --spring.profiles.active=dev
# 本番環境で実行
java -jar my-app.jar --spring.profiles.active=prod

プロジェクト全体で一貫したパッケージ構造を維持します。

com.example.myapp/
├── feature1/
│ ├── controller/
│ ├── service/
│ ├── repository/
│ └── model/
└── feature2/
├── controller/
├── service/
├── repository/
└── model/

依存関係の方向を明確にします:

  • Controller → Service → Repository → Model
  • 下位レイヤーは上位レイヤーに依存しない

機密情報(パスワード、APIキーなど)は環境変数や設定サーバーで管理します。

application.properties
spring.datasource.password=${DB_PASSWORD}

テストコードは、メインソースコードと同じパッケージ構造を維持します。

src/test/java/com/example/myapp/
├── controller/
├── service/
└── repository/

Spring Bootプロジェクトのフォルダ構成は、以下の原則に基づいています:

  • 標準的な構造: Maven/Gradleの標準構造に準拠
  • レイヤードアーキテクチャ: 責務の分離と保守性の向上
  • 環境別設定: 環境ごとの設定ファイルの分離
  • 一貫性: プロジェクト全体での一貫した構造

適切なフォルダ構成により、コードの可読性、保守性、テスト容易性が向上し、チーム開発の効率も高まります。