Spring Bootでよく使用するアノテーション入門

# Spring Bootでよく使用するアノテーション入門

## はじめに

Spring Bootでは、アノテーションを使用して様々な機能を実装します。この記事では、Spring Bootプロジェクトでよく使用するアノテーションと、その使用方法について説明します。

## 1. コアアノテーション

### @SpringBootApplication

アプリケーションのメインクラスに付与するアノテーションです。以下の3つのアノテーションを組み合わせたものです：

- @Configuration
- @EnableAutoConfiguration
- @ComponentScan

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

### @Configuration

Springの設定クラスを示すアノテーションです。

```java
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
```

### @ComponentScan

コンポーネントをスキャンするベースパッケージを指定します。

```java
@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class Application {
    // ...
}
```

## 2. 依存性注入（DI）関連

### @Autowired

依存性の自動注入を行います。

```java
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    // コンストラクタインジェクション
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
```

### @Qualifier

同じ型のBeanが複数ある場合に、特定のBeanを指定します。

```java
@Service
public class UserService {
    @Autowired
    @Qualifier("jdbcUserRepository")
    private UserRepository userRepository;
}
```

### @Value

プロパティファイルの値を注入します。

```java
@Service
public class EmailService {
    @Value("${mail.host}")
    private String mailHost;
    
    @Value("${mail.port}")
    private int mailPort;
}
```

## 3. Web関連

### @Controller

Webコントローラーを示すアノテーションです。

```java
@Controller
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        // ...
    }
}
```

### @RestController

RESTful APIのコントローラーを示すアノテーションです。

```java
@RestController
@RequestMapping("/api/users")
public class UserRestController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
    }
}
```

### @RequestMapping

URLマッピングを定義します。

```java
@RestController
@RequestMapping("/api/v1")
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public List<User> getUsers() {
        // ...
    }
}
```

### @GetMapping, @PostMapping, @PutMapping, @DeleteMapping

HTTPメソッドごとのマッピングを定義します。

```java
@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
    }
    
    @PostMapping
    public User createUser(@RequestBody User user) {
        // ...
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        // ...
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        // ...
    }
}
```

## 4. データアクセス関連

### @Repository

データアクセス層のコンポーネントを示すアノテーションです。

```java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // ...
}
```

### @Transactional

トランザクション管理を行います。

```java
@Service
public class UserService {
    @Transactional
    public void createUser(User user) {
        // ...
    }
    
    @Transactional(readOnly = true)
    public User getUser(Long id) {
        // ...
    }
}
```

## 5. バリデーション関連

### @Valid

Bean Validationを有効にします。

```java
@RestController
public class UserController {
    @PostMapping("/users")
    public User createUser(@Valid @RequestBody User user) {
        // ...
    }
}
```

### @NotNull, @Size, @Email など

フィールドのバリデーションルールを定義します。

```java
public class User {
    @NotNull
    private Long id;
    
    @Size(min = 2, max = 50)
    private String name;
    
    @Email
    private String email;
}
```

## 6. セキュリティ関連

### @Secured

メソッドレベルのセキュリティを定義します。

```java
@Service
public class UserService {
    @Secured("ROLE_ADMIN")
    public void deleteUser(Long id) {
        // ...
    }
}
```

### @PreAuthorize

メソッド実行前の認可チェックを行います。

```java
@Service
public class UserService {
    @PreAuthorize("hasRole('ADMIN')")
    public void updateUser(User user) {
        // ...
    }
}
```

## 7. テスト関連

### @SpringBootTest

Spring Bootの統合テストを示すアノテーションです。

```java
@SpringBootTest
class UserServiceTest {
    @Autowired
    private UserService userService;
    
    @Test
    void testCreateUser() {
        // ...
    }
}
```

### @MockBean

モックオブジェクトを定義します。

```java
@SpringBootTest
class UserServiceTest {
    @MockBean
    private UserRepository userRepository;
    
    @Autowired
    private UserService userService;
}
```

## まとめ

この記事では、Spring Bootでよく使用するアノテーションについて説明しました。主なポイントは以下の通りです：

1. コアアノテーション
2. 依存性注入関連
3. Web関連
4. データアクセス関連
5. バリデーション関連
6. セキュリティ関連
7. テスト関連

これらのアノテーションを適切に使用することで、効率的な開発が可能になります。

## 参考資料

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