독도갈매기의 개발 블로그

[Spring] IoC ( Inversion of Control : 제어권 역전 ) 본문

Java

[Spring] IoC ( Inversion of Control : 제어권 역전 )

독도갈매기 2021. 9. 30. 18:00

IoC ( Inversion of Control : 제어권 역전 )

일반적인 의존성에 대한 제어권 : 개발자가 직접 의존성을 만든다.

의존성 ( 코드 적인 의미 )

어떤 객체가 사용해야 할 객체라고 할 수 있고, 더 쉽게 말하자면 직접 new 등을 써서 만들어 쓰면 의존성을 자기가 직접 만들어 쓴다고 할 수 있습니다.

제어권 역전이 일어나지 않는 코드

public class TestRepository {...}

public class TestController {
    // 직접 TestRepository를 생성하여 사용.
    private TestRepository testController = new TestRepository();
}

제어권 역전

IoC는 전통적인 방식에 반대되는 흐름으로 코드가 진행되는 것. 매우 광범위개념입니다.

DI는 IoC 개념을 구현하기 위한 구현 방법이라면 DIP는 IoC와 같은 분류인 개념이기 때문입니다.

프레임 워크 중 Spring으로 예를 들었을 때 A Class가 B Class 의존 관계를 가지고 있고 생성자 주입 방법을 사용해 DI를 구현 했다면 외부에서 인스턴스 생성 후 매개변수를 넘겨주어야 하지만 Spring에서는 Bean을 사용해 생성 제어권 역전이 일어나 IoC를 충족하는 DI 개발이 가능함.

// 일반적인 생성자 주입
public class A(B b) {...} // B Class를 의존하는 A Class
public static void main(String args[]) {
    B b = new B(); // 외부에서 생성한 B class의 Instance
    A a = new A(b); // 생성자 주입을 위한 b Instance 주입
}

즉, 밖에서 나에게 의존성을 주입해주는 것을 DI( Dependency Injection : 의존성 주입 ) 라고 합니다. 따라서 DI는 IoC의 일종임.

→ DI와 IoC를 많이 혼동함. 이 둘은 분류부터가 다르기 때문에 IoC 중 하나라고도 말할 수 없음. 그저 IoC를 개념을 구현하기 위한 구현 방법일 뿐. 오히려 말한다면 DIP가 IoC의 한 형태는 될 수 있음.

제어권 역전이 일어나는 코드

public TestController {
    public TestController(TestRepository repoService, TestClass testClass) {
        this.repo = repoService;
        this.classTest = testClass;
    }
}

// TestContoller의 생성자에서 TestRepository를 인자로 받고, repo에 담고 있음.
// 이는 전 코드처럼 인스턴스를 직접 생성하지 않고, 의존 주체 모듈의 생성자 매개변수로 의존 대상 모듈 인스턴스가 주입 되어 의존 주체 인스턴스가 생성됨과 동시에 의존성이 해결되는 위와 같은 코드가 CI ( Constructor Injection : 생성자 주입 )입니다.
Comments