フォルダ構成
📁 Spring Bootプロジェクトのフォルダ構成
Section titled “📁 Spring Bootプロジェクトのフォルダ構成”Spring Bootプロジェクトのフォルダ構成は、MavenやGradleの標準的な構造に基づいており、開発者がファイルを探しやすく、アプリケーションの役割を理解しやすくなるよう設計されています。
📋 標準的なプロジェクト構造
Section titled “📋 標準的なプロジェクト構造”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主要ディレクトリの役割
Section titled “主要ディレクトリの役割”src/main/java/
Section titled “src/main/java/”アプリケーションのメインソースコードを格納します。
パッケージ構造の例:
com.example.myapp/├── MyAppApplication.java # Spring Bootアプリケーションのエントリーポイント├── controller/ # REST APIエンドポイントを定義├── service/ # ビジネスロジックを実装├── repository/ # データアクセス層├── model/ # エンティティクラス├── dto/ # データ転送オブジェクト├── config/ # 設定クラス├── exception/ # カスタム例外└── util/ # ユーティリティクラスsrc/main/resources/
Section titled “src/main/resources/”アプリケーションの設定ファイルや静的リソースを格納します。
application.propertiesの例:
# サーバー設定server.port=8080server.servlet.context-path=/api
# データベース設定spring.datasource.url=jdbc:postgresql://localhost:5432/mydbspring.datasource.username=myuserspring.datasource.password=mypasswordspring.datasource.driver-class-name=org.postgresql.Driver
# JPA設定spring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=true
# ロギング設定logging.level.com.example.myapp=DEBUGlogging.level.org.springframework.web=INFOsrc/test/java/
Section titled “src/test/java/”テストコードを格納します。メインソースコードと同じパッケージ構造を維持します。
テストクラスの例:
@SpringBootTestclass UserServiceTest {
@Autowired private UserService userService;
@Test void testFindUser() { // テストコード }}レイヤードアーキテクチャ
Section titled “レイヤードアーキテクチャ”Spring Bootアプリケーションは、通常、レイヤードアーキテクチャに基づいて構成されます。
1. Controller層(controller/)
Section titled “1. Controller層(controller/)”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); }}2. Service層(service/)
Section titled “2. Service層(service/)”ビジネスロジックを実装する層です。
@Service@Transactionalpublic 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) { // 変換ロジック }}3. Repository層(repository/)
Section titled “3. Repository層(repository/)”データアクセスを担当する層です。
@Repositorypublic interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByEmail(String email); List<User> findByNameContaining(String name);}4. Model層(model/)
Section titled “4. Model層(model/)”エンティティクラスを定義する層です。
@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}環境別設定ファイル
Section titled “環境別設定ファイル”環境ごとに異なる設定を使用する場合、application-{profile}.propertiesという命名規則を使用します。
resources/├── application.properties # 共通設定├── application-dev.properties # 開発環境├── application-test.properties # テスト環境└── application-prod.properties # 本番環境使用例:
# 開発環境で実行java -jar my-app.jar --spring.profiles.active=dev
# 本番環境で実行java -jar my-app.jar --spring.profiles.active=prodベストプラクティス
Section titled “ベストプラクティス”1. パッケージ構造の一貫性
Section titled “1. パッケージ構造の一貫性”プロジェクト全体で一貫したパッケージ構造を維持します。
com.example.myapp/├── feature1/│ ├── controller/│ ├── service/│ ├── repository/│ └── model/└── feature2/ ├── controller/ ├── service/ ├── repository/ └── model/2. レイヤー間の依存関係
Section titled “2. レイヤー間の依存関係”依存関係の方向を明確にします:
- Controller → Service → Repository → Model
- 下位レイヤーは上位レイヤーに依存しない
3. 設定ファイルの管理
Section titled “3. 設定ファイルの管理”機密情報(パスワード、APIキーなど)は環境変数や設定サーバーで管理します。
spring.datasource.password=${DB_PASSWORD}4. テストコードの配置
Section titled “4. テストコードの配置”テストコードは、メインソースコードと同じパッケージ構造を維持します。
src/test/java/com/example/myapp/├── controller/├── service/└── repository/Spring Bootプロジェクトのフォルダ構成は、以下の原則に基づいています:
- 標準的な構造: Maven/Gradleの標準構造に準拠
- レイヤードアーキテクチャ: 責務の分離と保守性の向上
- 環境別設定: 環境ごとの設定ファイルの分離
- 一貫性: プロジェクト全体での一貫した構造
適切なフォルダ構成により、コードの可読性、保守性、テスト容易性が向上し、チーム開発の効率も高まります。