DI와 IoC

오하수·2026년 1월 21일
post-thumbnail

DI(Dependency injection)

DI를 이해하기 위해 먼저 Dependency부터 알아보자.

Dependency, 한국어로 종속성, 의존성은 하나의 객체가 다른 객체의 기능에 의존하는 관레를 말합니다. DI에는 직접 객체를 생성해서 자신이 사용하는 일체형 관계와 외부에서 생성한 객체를 사용하는 결합형 관계가 있다.


1. Constructor Injection : 직접 객체 생성

class B {
    // B 클래스의 내용
}

class A {
    private B b;

    public A() {
        b = new B(); // A의 생성자에서 B 객체를 직접 생성
    }
}

일체형 관계에서는 class A와 Class B가 강하게 결합되어 있음을 의미합니다. 이 경우 class B의 구현 변경이 필요할 때 class A도 함께 수정해야 하는 단점을 갖게 됩니다.


2.Setter Injection : 외부에서 객체 주입

class B {
    // B 클래스의 내용
}

class A {
    private B b;

    public A() {
        // A 생성자에서는 B 객체를 생성하지 않습니다.
    }
    
    public void setB(B b) {
        this.b = b; // 세터를 통한 의존성 주입
    }
}

// 사용 예
class Main {
    public static void main(String[] args) {
        B b = new B(); // B 객체를 외부에서 생성
        A a = new A(); // A 객체 생성
        a.setB(b);     // Setter를 통한 A 객체에 B 객체 주입
    }
}

결합형 관계에서는 class B의 인스턴스를 외부에서 생성한 후 class A에 제공합니다. 이렇게 다른 클래스에 대한 의존성을 외부에서 주입 바든 방식을 바로 의존성 주입이라고 하고 이 같은 경우 class B를 다른 구현으로 쉽게 바꿀 수 있으며, class A를 변경할 필요가 없는 장점을 얻으며 테스트도 용이하게 됩니다.


스프링이 DI를 해주는 방식

바로 객체를 IoC컨테이너 안에 생성하여 사용자가 필요할 때 꺼내쓸 수 있도록 해주는 방식으로 도와줍니다.

개발자가 Bean으로 ICO 컨테이너 등록한 객체를 쓰는 방식이다.


IoC(Inversion of control)

IoC는 영어 그대로 제어의 역전이라는 뜻이다. 프로그램의 흐름을 개발자가 제어하지 않고, 프로그램이나 프레임웍이 직접 제어를 한다는 말이다. 컴포넌트의 의존 관계 결정, 객체의 생명 주기와 같은 일을 대신 수행해준다.

사용자의 요청이 들어오면, 요청에 알맞은 Bean을 생성해서 필요한 일을 하도록 시킨다. 해당 Bean이 할 일을 마치면 Bean을 삭제해준다. 하지만 이런 객체의 생성과 소멸이 어떻게 이루어지는지 알 필요가 없다. 프로그래머가 직접 제어 할 필요가 없이 프레임웤이 직접 제어해주기 때문이다. 이것이 IoC 제어의 역전이다.

컨테이너?

컨테이너는 IoC컨테이너라고도 불린다. 컨테이너는 코드의 처리 과정을 위임 받은 독립적인 존재이다.

적절한 설정을 해주면, 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 관리한다.

profile
오늘하루도수고하세용~

0개의 댓글