今回初投稿となります。
今年からIT業界に転職し、アプリ開発をしていく中で学んだことをまとめ、発信していくために投稿を始めました。
皆さんのお力になれれば幸いです。
今回はSpringBootでの開発を行っていく中でアノテーションを使用する機会が多かったので簡単にまとめました。
アノテーションとは?
簡単に言うと: プログラムに対する「メモ書き」や「指示書」みたいなもの
SpringBootでのアノテーションを料理に例えると…?
Java = 料理の基本技術
「炒める」「煮る」「焼く」みたいな基本動作
SpringBoot = 特定のレストランチェーンのルール
「うちの店では@大盛りタグを使ってね」
「@辛口タグはこう処理してね」
アノテーションが「材料や調理法に付ける指示タグ」で、
SpringBootがその「指示タグを理解して実際に調理してくれるシェフ」と解釈する事ができる💡
アノテーションを使うメリット
1. 設定の簡素化
- XML設定ファイルが不要になる
- コードと設定が同じ場所にあるので管理しやすい
- 設定ミスが減る
2. 開発効率の向上
- ボイラープレートコードを大幅に削減
- 自動設定により手動設定の手間が省ける
- IDEがアノテーションを認識してコード補完やエラー検出をサポート
3. 保守性の向上
- コードの意図が明確になる
- 機能ごとにアノテーションでグループ化できる
- 変更時の影響範囲が分かりやすい
主要なアノテーションの種類と使用方法
コアアノテーション
@SpringBootApplication
@SpringBootApplication
public class TaskManagementApplication {
public static void main(String[] args) {
SpringApplication.run(TaskManagementApplication.class, args);
}
}
- 役割: アプリケーションのエントリーポイント
- 内包: @Configuration + @EnableAutoConfiguration + @ComponentScan
- 使用場面: メインクラスに必ず付ける
@Configuration
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
*// データソースの設定*
return new HikariDataSource();
}
}
- 役割: 設定クラスであることを示す
- 使用場面: Bean定義やカスタム設定を行う場合
コンポーネントアノテーション
@Service
@Service
public class TaskService {
@Autowired
private TaskRepository taskRepository;
public List<Task> getAllTasks() {
return taskRepository.findAll();
}
public Task saveTask(Task task) {
return taskRepository.save(task);
}
}
- 役割: ビジネスロジックを担当するサービス層
- 特徴: @Componentの特殊化版
@Repository
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
List<Task> findByStatus(TaskStatus status);
List<Task> findByDueDateBefore(LocalDate date);
}
- 役割: データアクセス層
- 特徴: データベース例外を適切なSpring例外に変換
@Controller
@Controller
public class TaskController {
@Autowired
private TaskService taskService;
@GetMapping("/tasks")
public String showTasks(Model model) {
model.addAttribute("tasks", taskService.getAllTasks());
return "tasks";
}
}
- 役割: MVCのコントローラー(画面遷移あり)
HTTPマッピングアノテーション
@RequestMapping系
@RestController
public class TaskController {
@GetMapping("/tasks/{id}")
public Task getTask(@PathVariable Long id) {
return taskService.findById(id);
}
@PostMapping("/tasks")
public Task createTask(@RequestBody Task task) {
return taskService.save(task);
}
@PutMapping("/tasks/{id}")
public Task updateTask(@PathVariable Long id, @RequestBody Task task) {
return taskService.update(id, task);
}
@DeleteMapping("/tasks/{id}")
public void deleteTask(@PathVariable Long id) {
taskService.delete(id);
}
}
パラメータバインディングアノテーション
@PathVariable
@GetMapping("/tasks/{id}")
public Task getTask(@PathVariable Long id) {
return taskService.findById(id);
}
- 役割: URLパスの変数を取得
@RequestParam
@GetMapping("/tasks")
public List<Task> getTasks(@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return taskService.getTasks(page, size);
}
- 役割: クエリパラメータを取得
@RequestBody
@PostMapping("/tasks")
public Task createTask(@RequestBody Task task) {
return taskService.save(task);
}
- 役割: HTTPリクエストボディをオブジェクトにマッピング
データベース関連アノテーション
@Entity
@Entity
@Table(name = "tasks")
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(length = 1000)
private String description;
@Enumerated(EnumType.STRING)
private TaskStatus status;
@CreationTimestamp
private LocalDateTime createdAt;
*// getters and setters*
}
JPA関連アノテーション
- @Id: 主キー
- @GeneratedValue: 主キーの生成戦略
- @Column: カラムの詳細設定
- @Table: テーブル名の指定
- @Enumerated: Enumの保存方式
バリデーションアノテーション
public class TaskCreateRequest {
@NotBlank(message = "タイトルは必須です")
@Size(max = 100, message = "タイトルは100文字以内で入力してください")
private String title;
@Size(max = 1000, message = "説明は1000文字以内で入力してください")
private String description;
@NotNull(message = "締切日は必須です")
@Future(message = "締切日は未来の日付を指定してください")
private LocalDate dueDate;
@Email(message = "正しいメールアドレス形式で入力してください")
private String assigneeEmail;
}
主要なバリデーションアノテーション
- @NotNull: null不可
- @NotBlank: 空文字・null・空白のみ不可
- @Size: 文字数制限
- @Min/@Max: 数値の範囲
- @Email: メールアドレス形式
- @Pattern: 正規表現チェック
アノテーション使用時のベストプラクティス
1. レイヤー分けを意識する
- @Controller/@RestController: プレゼンテーション層
- @Service: ビジネスロジック層
- @Repository: データアクセス層
- @Component: その他のコンポーネント
2. 依存性注入はコンストラクタ注入を使う
- テストしやすい
- 依存関係が明確
- final修飾子が使える
3. @Transactionalは適切なレベルで使う
- サービス層に付ける
- readOnly = trueで読み取り専用を明示
- 必要な部分のみでトランザクション境界を区切る
4. バリデーションは確実に行う
- DTOクラスにバリデーションアノテーションを付ける
- コントローラーで@Validを忘れない
- カスタムバリデーションも活用する
まとめ
SpringBootのアノテーションは覚えるのは大変だが、適切に使えば:
- コード量が劇的に減る
- 設定ミスが起きにくくなる
- 可読性が向上する
- 保守性が高まる
この記事が皆様のお役に立てれば幸いです!