Spring Boot 강좌8 : IoC와 DI에 대한 이해

coldrice99·2024년 10월 8일
0

TIL: IoC(제어의 역전)와 DI(의존성 주입)

오늘은 Spring에서 IoC(제어의 역전)DI(의존성 주입)의 개념을 학습하였다. 이 두 가지는 좋은 코드를 작성하기 위한 중요한 원칙이며, Spring의 핵심 기술 중 하나이다.

1. IoC와 DI란 무엇인가?

  • IoC(Inversion of Control): 전통적인 절차에서 객체가 스스로 제어하던 흐름을 외부에서 관리하도록 역전시키는 설계 원칙이다.
  • DI(Dependency Injection): 의존성을 직접 생성하지 않고 외부에서 주입받아 사용하는 디자인 패턴이다. DI는 IoC를 구현하는 방식으로, 객체 간의 결합도를 낮추고 유지보수성을 높인다.

2. 의존성과 결합

객체가 다른 객체를 직접 생성하여 사용하는 것을 강한 결합이라고 하며, 이는 코드 수정 시 많은 부분에서 변경이 필요하게 만든다. 이를 해결하기 위해 인터페이스를 사용하여 약한 결합으로 만들어야 한다.

예시 코드:
public class Consumer {
    void eat(Food food) {
        food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.eat(new Chicken());
        consumer.eat(new Pizza());
    }
}

interface Food {
    void eat();
}

class Chicken implements Food {
    public void eat() {
        System.out.println("치킨을 먹는다.");
    }
}

class Pizza implements Food {
    public void eat() {
        System.out.println("피자를 먹는다.");
    }
}

이 코드는 인터페이스 다형성을 활용하여 서로 다른 음식 객체를 쉽게 교체할 수 있게 만들어준다. 이러한 방법이 약한 결합을 이루는 방법이다.

3. 주입 방식

의존성을 주입하는 방법은 크게 필드 주입, 메서드 주입, 생성자 주입이 있다. 그 중, 생성자 주입이 가장 권장되는 방법이다.

생성자 주입 예시 코드:
public class Consumer {
    Food food;

    public Consumer(Food food) {
        this.food = food;
    }

    void eat() {
        this.food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer(new Chicken());
        consumer.eat();

        consumer = new Consumer(new Pizza());
        consumer.eat();
    }
}

이 코드는 생성자를 통해 의존성을 주입받아 사용하는 방식이다. Consumer 클래스는 Food 객체에 의존하지만, 그 의존성은 외부에서 주입되므로 강한 결합을 피할 수 있다.

4. 제어의 역전

기존에는 Consumer가 직접 Food를 생성하고 사용했다면, 이제는 외부에서 생성한 Food를 주입받아 사용한다. 이것이 제어의 흐름이 역전되었다는 의미이다.


오늘 학습을 통해 IoC와 DI가 객체 간의 결합도를 줄이고, 유지보수와 확장성을 높이는 데 얼마나 중요한지 알 수 있었다. Spring은 이 개념들을 통해 개발자들이 더 나은 코드를 작성할 수 있도록 돕는다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글