독도갈매기의 개발 블로그
[Spring] IoC ( Inversion of Control : 제어권 역전 ) 본문
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 : 생성자 주입 )입니다.
'Java' 카테고리의 다른 글
[Spring] Spring은 왜 많이 쓰일까? -2- (0) | 2021.10.05 |
---|---|
[Spring] Spring은 왜 많이 쓰일까? -1- (3) | 2021.10.04 |
[Spring] 인터셉터 ( Interceptor ) (0) | 2021.10.01 |
[Spring] DI ( Dependency Injection : 의존성 주입 ) (0) | 2021.09.29 |
[Java] 자바 문자열(String)을 비교하는 방법 (0) | 2020.09.14 |
Comments