0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SpringBoot入門】 アノテーションをまとめてみた

Last updated at Posted at 2025-09-04

今回初投稿となります。
今年からIT業界に転職し、アプリ開発をしていく中で学んだことをまとめ、発信していくために投稿を始めました。

皆さんのお力になれれば幸いです。
今回はSpringBootでの開発を行っていく中でアノテーションを使用する機会が多かったので簡単にまとめました。

アノテーションとは?

簡単に言うと: プログラムに対する「メモ書き」や「指示書」みたいなもの

SpringBootでのアノテーションを料理に例えると…?

Java = 料理の基本技術
「炒める」「煮る」「焼く」みたいな基本動作

SpringBoot = 特定のレストランチェーンのルール
「うちの店では@大盛りタグを使ってね」
「@辛口タグはこう処理してね」

アノテーションが「材料や調理法に付ける指示タグ」で、
SpringBootがその「指示タグを理解して実際に調理してくれるシェフ」と解釈する事ができる💡
 
 
Close-up_shot_of_hands_typing_on_a_computer_while_-1756942855619.png
 

アノテーションを使うメリット

1. 設定の簡素化

  • XML設定ファイルが不要になる
  • コードと設定が同じ場所にあるので管理しやすい
  • 設定ミスが減る

2. 開発効率の向上

  • ボイラープレートコードを大幅に削減
  • 自動設定により手動設定の手間が省ける
  • IDEがアノテーションを認識してコード補完やエラー検出をサポート

3. 保守性の向上

  • コードの意図が明確になる
  • 機能ごとにアノテーションでグループ化できる
  • 変更時の影響範囲が分かりやすい

主要なアノテーションの種類と使用方法

コアアノテーション

@SpringBootApplication

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

@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関連アノテーション

バリデーションアノテーション

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;
}

主要なバリデーションアノテーション

アノテーション使用時のベストプラクティス

1. レイヤー分けを意識する

2. 依存性注入はコンストラクタ注入を使う

  • テストしやすい
  • 依存関係が明確
  • final修飾子が使える

3. @Transactionalは適切なレベルで使う

  • サービス層に付ける
  • readOnly = trueで読み取り専用を明示
  • 必要な部分のみでトランザクション境界を区切る

4. バリデーションは確実に行う

  • DTOクラスにバリデーションアノテーションを付ける
  • コントローラーで@Validを忘れない
  • カスタムバリデーションも活用する

まとめ

SpringBootのアノテーションは覚えるのは大変だが、適切に使えば:

  • コード量が劇的に減る
  • 設定ミスが起きにくくなる
  • 可読性が向上する
  • 保守性が高まる

この記事が皆様のお役に立てれば幸いです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?