こんにちわ、masumasuです。
今年も残り少なくなってきました、皆様はいかがお過ごしでしょうか。
今回は、前回の記事で紹介した Controller と Routing の続編として、@Service と @Repository の役割をコード例付きで解説していきます。
Spring Boot では「Controller → Service → Repository」という三層アーキテクチャを採用しており、これを理解するとアプリケーション全体をきれいに保つことができます。
■ 三層アーキテクチャの簡単な流れ
- Controller:HTTPリクエストの受付・レスポンスの返却
- Service:ビジネスロジック(条件分岐・計算・処理手順)
- Repository:DB(データベース)アクセス
では、実際のコードを見ながら確認してみます。
■ Repository:DBアクセス担当
@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {
}
たったこれだけで CRUD(検索・保存・削除)が自動生成されます。
Spring Data JPA が裏側で SQL を実行してくれるので、開発者は複雑なクエリを書かずに済みます。
■ Service:ビジネスロジック担当
@Service
public class ItemService {
private final ItemRepository itemRepository;
public ItemService(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
public Item getItemOrThrow(Long id) {
return itemRepository.findById(id)
.orElseThrow(() -> new RuntimeException("商品が見つかりません"));
}
public Item createItem(Item item) {
// ここでバリデーションや計算などのロジックを書ける
return itemRepository.save(item);
}
}
Service 層は 「どう処理するか」 に集中します。
Repository をそのまま Controller から呼ぶのではなく、Service にロジックをまとめることでテストがしやすくなり、コードが整理されます。
■ Controller:入出力のみに集中
@RestController
@RequestMapping("/items")
public class ItemController {
private final ItemService itemService;
public ItemController(ItemService itemService) {
this.itemService = itemService;
}
@GetMapping("/{id}")
public Item getItem(@PathVariable Long id) {
return itemService.getItemOrThrow(id);
}
@PostMapping
public Item create(@RequestBody Item item) {
return itemService.createItem(item);
}
}
Controller は「リクエスト → Service 呼び出し → レスポンス」という流れだけを担当します。
処理が複雑になりがちな部分はすべて Service に任せることで、Controller のコードは常にシンプルなままです。
■ まとめ
今回は@Service と @Repository の役割について書きました。
ご覧いただきありがとうございます。