SPRING&BOOT

IoC (제어의 역전) 이해하기

jki09871 2024. 8. 13. 18:17

1. IoC(제어의 역전)란?

IoC(Inversion of Control, 제어의 역전)는 소프트웨어 디자인 원칙 중 하나다. 제어의 역전이란, 프로그램의 흐름 제어 권한을 개발자가 아닌 프레임워크나 외부 컨테이너가 담당하는 것을 말한다.

2. IoC의 기본 원리

IoC의 핵심 원리는 의존성 주입(Dependency Injection)이다. 의존성 주입이란, 객체가 자신이 필요한 다른 객체를 직접 생성하는 대신 외부에서 주입받는 방식이다. 이로 인해 객체 간 결합도가 낮아지고, 유연성과 재사용성이 높아진다.

(DI 관련 글 : https://jki09871.tistory.com/55) 

3. IoC의 예시

3.1 전통적인 방식

class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

class Car {
    private Engine engine;

    public Car() {
        engine = new Engine(); // Car가 Engine 객체를 직접 생성
    }

    public void start() {
        engine.start();
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();  // Main이 Car 객체를 직접 생성
        car.start();
    }
}

위 코드에서 Car 클래스는 Engine 객체를 직접 생성한다. 이 방식은 객체 간 결합도가 높으며, Engine 클래스가 바뀌면 Car 클래스도 수정해야 한다.

3.2 IoC 적용 방식

class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

class Car {
    private Engine engine;

    // 의존성 주입
    public Car(Engine engine) {
        this.engine = engine; // 외부에서 Engine 객체를 주입받음
    }

    public void start() {
        engine.start();
    }
}

public class Main {
    public static void main(String[] args) {
        Engine engine = new Engine(); // Main이 Engine 객체를 생성
        Car car = new Car(engine);    // Main이 Car 객체에 Engine 객체를 주입
        car.start();
    }
}

IoC를 적용한 코드에서는 Car 클래스가 더 이상 Engine 객체를 직접 생성하지 않고, 외부에서 주입받는다. 이로 인해 Car 클래스는 Engine 클래스의 구체적인 구현에 덜 의존하게 되며, 더 쉽게 테스트하거나 다른 객체로 교체할 수 있다.

4. IoC의 장점

IoC를 적용하면 다음과 같은 장점을 얻을 수 있다:

  • 유연성 증가: 클래스 간 결합도가 낮아져, 서로 독립적으로 변경할 수 있다.
  • 테스트 용이성: 의존성 주입을 통해 모의 객체(mock object)를 사용한 단위 테스트가 쉬워진다.
  • 재사용성 향상: 코드가 모듈화되어 재사용이 용이하다.
  • 유지보수성 개선: 변경 사항이 적은 코드 영역으로 한정되어, 유지보수가 쉽다.

결론

IoC는 유연한 설계와 유지보수를 가능하게 하는 중요한 소프트웨어 설계 원칙이다. 의존성 주입 같은 기법을 통해 코드의 결합도를 낮추고, 테스트 용이성과 재사용성을 높일 수 있다. 다양한 프레임워크에서 IoC를 채택하고 있으므로, 이를 이해하고 활용하는 것이 더 나은 소프트웨어 설계를 위한 필수 요소다.