【Java】RepositoryとServiceについて

こんにちわ、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 の役割について書きました。

ご覧いただきありがとうございます。