🧑‍💻 Spring Framework 講座【第5回】Springの核心!〜DIとIoCの理解で「設計の悩み」を解決する〜

docs

前回までの4回で、Javaの基本とプロジェクト管理の土台が整いました。いよいよ今回から、Spring Frameworkの核となる考え方に入っていきます。

今回のテーマは、Springの最も重要なコンセプトである「DI(依存性の注入)」と「IoC(制御の反転)」です。この考え方を理解できると、なぜSpringが業務システム開発で圧倒的な支持を得ているのかがわかります。

1. Spring Frameworkが解決する「設計の悩み」

大規模な業務システムを作る際、プログラマは必ずある「悩み」に直面します。それは「オブジェクト間の依存関係」です。

1-1. 従来のJavaプログラムの問題点(依存関係の結合が強い)

オブジェクト指向では、複数のクラス(部品)を組み合わせて機能を実現します。例えば、顧客情報を保存する機能を作りたいとします。

Java

// 従来のJavaコードの例
public class CustomerService {
    
    // ① サービス層がデータベースの部品(Repository)を「自分で」作っている
    private CustomerRepository repository = new new CustomerRepository(); 

    public void saveCustomer() {
        // ② newで作成した部品に処理を依頼
        repository.save(); 
    }
}

このコードの問題点は、「CustomerServiceがCustomerRepositoryに強く依存している」ことです。

  • もし、データベースの種類をMySQLからPostgreSQLに変えたくなっても(CustomerRepositoryの中身が変わっても)、CustomerServiceのコードを書き換える必要があります。
  • テストをする際、実際のデータベースを使わず**模擬の部品(モック)**に差し替えたくても、newで固定されているため難しいです。

このように、部品同士の結びつきが強すぎると、**「柔軟性の低い」「変更に弱い」**システムになってしまいます。


2. Springの核となる考え方 (1):IoC(制御の反転)

IoC (Inversion of Control: 制御の反転) とは、「誰がオブジェクトを作るか」というプログラムの「制御」を反転させるという考え方です。

  • 従来: プログラマが**new**を使って「自分で」オブジェクトを生成し、制御する。
  • Spring/IoC: オブジェクトの生成や管理を、プログラマではなく**Spring(のコンテナ)**に任せる。

Springは、プログラム実行時に全ての部品(オブジェクト)を自動で作成し、まとめて管理する場所を持っています。これを「IoCコンテナ」または「Springコンテナ」と呼びます。

プログラマは必要な部品の定義だけを行い、コンテナが必要に応じてそれらを生成・提供してくれます。

3. Springの核となる考え方 (2):DI(依存性の注入)

IoCコンテナが部品を管理してくれるようになったとして、サービスがリポジトリを「使う」にはどうすれば良いでしょうか?ここで登場するのが DI (Dependency Injection: 依存性の注入) です。

DIとは、あるオブジェクトが必要とする別のオブジェクト(依存関係)を、外部(IoCコンテナ)から「注入」してもらう仕組みです。

これにより、先ほどのCustomerServiceは以下のように劇的に変わります。

DIを適用したSpringコードの例

Java

// Springを使用したJavaコードの例
// @Serviceアノテーションは、このクラスをSpringの部品(Bean)として登録することを意味する
@Service
public class CustomerService {
    
    // ① newを使わず、必要な部品の「宣言」だけを行う
    private CustomerRepository repository; 

    // ② コンストラクタを使って依存関係を注入してもらう
    @Autowired // Springに注入を依頼するアノテーション
    public CustomerService(CustomerRepository repository) {
        this.repository = repository;
    }
    
    // ③ 注入された部品を使って処理を実行
    public void saveCustomer() {
        repository.save(); 
    }
}

【DIのメリット】

  • CustomerServiceはnewを使わないため、**どの具体的なCustomerRepositoryが使われるかを知りません**。
  • CustomerServiceが「**CustomerRepositoryの役割を持つものが一つ必要だ**」という宣言をするだけで、Springコンテナが自動で適切な部品を「注入」してくれます。
  • これにより、部品同士の結合が緩くなり、柔軟で変更に強いシステムが実現します。これがSpring Frameworkの存在意義そのものです。

4. まとめ:DIとIoCの関係

**IoC(制御の反転)**という思想を実現するための具体的な手段が DI(依存性の注入) です。

用語意味解決する問題
IoCオブジェクトの生成や管理をコンテナに反転させる。誰が部品を作るかという制御の問題。
DI必要な部品をコンテナから注入してもらう。部品同士の強い依存関係の問題。
IoCコンテナSpringが部品を管理する場所

このDI/IoCこそが、Springが提供する全ての機能(Web、DB接続、セキュリティなど)の土台となっています。

✅ 本日のまとめ

  • Spring Frameworkは、DI (依存性の注入)IoC (制御の反転) を通じて、部品同士の結合度を下げ柔軟でテストしやすいシステム開発を実現する。
  • IoCコンテナが全ての部品(Bean)を管理し、@Autowiredなどのアノテーションを通じて必要な部品を自動で「注入」してくれる。

🔔 次回予告

DI/IoCの概念は理解できましたが、Springコンテナが実際にどのようにして私たちのコードを部品(Bean)として認識し、管理しているのでしょうか?

次回は、このIoCコンテナの中身に踏み込み、「Bean」の定義方法と、「ApplicationContext」の役割について、より具体的なコードを通じて解説します。

次回:【第6回】IoCコンテナとBeanの基礎 にご期待ください!

コメント

タイトルとURLをコピーしました