2023. 12. 11. 15:30 SpringBoot
IOC란 무엇인가?
spring 을 공부하면 필연적으로 듣게 되는 단어가 있다
바로 IOC 이다.
IOC는 Inverse of control 이라는 의미로 "제어의 역전"이라는 의미이다.
IOC는 코드의 제어가 유저에게 있는것이 아닌 framework 등 제 3자에게 위임되는 것을 의미한다.
쉽게 예를 들어보자.
class A
{
public void callMe()
{
....
}
}
현재 사용하는 framework가 A라는 class의 함수를 내부에서 호출한다고 가정해보자.
즉, 해당 class에 대해서 함수의 호출 혹은 객체 생성등을 framework가 제어하고 있는 상태이다.
이러한 상황에서 우리가 A에 대한 callMe함수 오버라이딩 등을 통해서 정의한다면 해당 코드에 대해서는 framework가 직접 제어하는 상황이 되는 것이다. (DI에 대해서는 추후에 다룰 예정)
IOC의 실제 사용 예는 대표적으로 아래의 예가 존재한다
. Template Method
. DI ( Dependency Injection )
. Strategy Pattern
. Factory Pattern
. Service Locator
DI (Dependency Injection )
DI란 의존성을 주입하는것을 의미한다.
Ioc를 구현하기 위해 사용되는 대표적인 design pattern 중 하나로 특정 객체의 의존 관계를 객체의 외부에서 주입시키는 패턴이다.
전통적인 구현방식에서는 특정 A class에 대한 정의 후 A를 호출하는 식으로 프로그램이 구현된다.
하지만 DI의 경우, 우리가 A를 재정의한 A`를 정의하면 A에 대한 호출은 이미 외부에서 선언이 되어 있는 상태이기 때문에 A`의 code 가 호출된다.
DI는 어떤 조건을 지켜야 만족하는 것인가?
. class code 혹은 class model에서는 의존 관계가 노출되지 않는다.
. runtime 시점의 의존관계는 factory 등의 제 3의 존재가 결정한다.
. 의존관계는 object에 대한 레퍼런스를 외부에서 주입함으로써 만들어진다.
public class A
{
prviate B b;
public A()
{
b = new B();
}
}
public class C
{
private D d;
public C(D d)
{
this.d = d;
}
}
위의 코드 중 A에 대한 내용을 살펴보자.
A의 내부에선 B에 대한 객체 생성을 진행하며 이를 내부 변수로 지닌다.
이 과정은 DI라고 볼수 없는데 우선 B의 생성자가 A에서 호출되기 때문에 추후에 B의 생성자가 변경될 시 A가 영향을 받는 문제가 존재한다.
또한 위의 code를 보면 A는 B를 생성한다는 점에서 사실상 B와 A가 class 수준으로 관계가 생긴것으로 볼 수 있다. 이 점에선 위의 DI가 지켜야할 조건중 하나를 지키지 못한것으로 볼 수 있다.
반면, D와 C의 경우를 살펴보면 C는 외부에서 D에 대한 객체를 전달 받는 것을 볼 수 있다.
이렇게 객체를 전달 받으면 C는 D의 레퍼런스를 전달 받는다.
D와 C는 객체에 대한 의존을 갖고 class 수준의 관계는 맺지 않으며, 의존관계는 외부에서 주입당하여 만들어진다. 또한 runtime 시에 외부에서 의존관계를 지정하기때문에 DI에 필요한 조건들을 만족한다.
위의 예에서는 생성자를 통해 D를 전달 받기는 했지만 의존성은 setter 함수 혹은 interface 구현을 통해서도 삽입 될 수 있다.
public class SetterA
{
private B b;
....
public void setB(B b)
{
this.b = b;
}
}
public class InterA extends injectorB
{
private B b;
@Override
public void injection(B b)
{
this.b = b;
}
...
}
interface injectorB
{
void injection(B b);
}
이렇게 setter와 interface를 사용하여 의존성을 주입할 수 있지만 setter의 경우 함수 정의를 누락할 여지가 있다.
'SpringBoot' 카테고리의 다른 글
Spring ApplicationContext (0) | 2023.12.11 |
---|---|
Spring에서의 IOC (0) | 2023.12.11 |
Bean과 Component (0) | 2023.11.30 |
SpringBoot와 SpringMVC의 차이와 특성에 대하여 (0) | 2023.11.29 |
@SpriongBootApplication 에 대해서 (0) | 2023.11.29 |