Java Springベストプラクティス入門（第1部）：プロジェクト構成とフォルダ構造

# Java Springベストプラクティス入門（第1部）：プロジェクト構成とフォルダ構造

## はじめに

Spring Frameworkを使用したプロジェクト開発において、適切なプロジェクト構成とフォルダ構造は、コードの保守性と拡張性を大きく左右します。この記事では、Springプロジェクトのベストプラクティスについて、特にフォルダ構成に焦点を当てて説明します。

## 推奨されるフォルダ構成

以下は、中規模から大規模なSpringプロジェクトで推奨されるフォルダ構成の例です：

```
src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           └── project/
│   │               ├── ProjectApplication.java
│   │               ├── config/
│   │               │   ├── SecurityConfig.java
│   │               │   └── WebConfig.java
│   │               ├── controller/
│   │               │   ├── UserController.java
│   │               │   └── ProductController.java
│   │               ├── service/
│   │               │   ├── UserService.java
│   │               │   └── ProductService.java
│   │               ├── repository/
│   │               │   ├── UserRepository.java
│   │               │   └── ProductRepository.java
│   │               ├── model/
│   │               │   ├── entity/
│   │               │   │   ├── User.java
│   │               │   │   └── Product.java
│   │               │   └── dto/
│   │               │       ├── UserDTO.java
│   │               │       └── ProductDTO.java
│   │               ├── exception/
│   │               │   ├── CustomException.java
│   │               │   └── GlobalExceptionHandler.java
│   │               └── util/
│   │                   └── DateUtils.java
│   └── resources/
│       ├── application.yml
│       ├── application-dev.yml
│       ├── application-prod.yml
│       └── static/
└── test/
    └── java/
        └── com/
            └── example/
                └── project/
                    ├── controller/
                    ├── service/
                    └── repository/
```

## 各ディレクトリの役割とベストプラクティス

### 1. ルートパッケージ（com.example.project）

- プロジェクトのメインアプリケーションクラスを配置
- パッケージ名は組織のドメインを逆順にした形式を使用

```java
@SpringBootApplication
public class ProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProjectApplication.class, args);
    }
}
```

### 2. config パッケージ

- アプリケーションの設定クラスを配置
- セキュリティ設定、Web設定、データベース設定など

```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}
```

### 3. controller パッケージ

- REST APIのエンドポイントを定義するコントローラークラスを配置
- リクエストの受け付けとレスポンスの返却を担当

```java
@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
}
```

### 4. service パッケージ

- ビジネスロジックを実装するサービスクラスを配置
- トランザクション管理や複数のリポジトリの連携を担当

```java
@Service
@Transactional
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public UserDTO findById(Long id) {
        User user = userRepository.findById(id)
            .orElseThrow(() -> new CustomException("User not found"));
        return convertToDTO(user);
    }
}
```

## まとめ

この記事では、Springプロジェクトの基本的なフォルダ構成と、各ディレクトリの役割について説明しました。適切なフォルダ構成を採用することで、以下のメリットが得られます：

- コードの可読性と保守性の向上
- チーム開発の効率化
- テストのしやすさ
- 機能の拡張性

次回の記事では、より詳細なベストプラクティスについて説明します。

## 参考資料

- [Spring Boot公式ドキュメント](https://spring.io/projects/spring-boot)
- [Spring Framework公式ドキュメント](https://spring.io/projects/spring-framework)