개요
느슨한 결합 DI IOC은 모두 의존성과 관련있는 용어로 클래스간의 의존성을 줄이기 위한 내용입니다. 소프트웨어 공학을 공부하며 결합력이 낮을 수록 좋은 소프트웨어라고 하는 걸 알 수 있습니다. 따라서 스프링에서는 객체간의 의존성을 줄이기 위해 아러한 방법들을 사용하는 것입니다.
1. 느슨한 결합
어떠한 클래스에서 다른 클래스의 객체를 이용할 때 A1 a = new A1() 와 같은 식으로 프로그램이 짜여져 있다면 어떨까요? 만약 A1이 아닌 A2로 사용하고 싶은 경우에는 코드에 A1을 찾아서 모두 A2로 바꿔야 할것입니다. 이는 A1이 늘어날 수록 엄청난 시간을 잡아먹게 될 것입니다.이때 위와 같이 프로그램을 작성하기 보다 A a = new A1() 과 같이 작성하고 A를 인터페이스로 작성하면 어떻게 될 까요. 이는 자료형은 그대로 놔두고 new A1()을 new A2()로만 바꿔주면 됩니다. 이 또한 교체하려면 엄청난 시간을 소비하게 될 것입니다. 따라서 스프링에서는 DI개념이 존재하며 IOC컨테이너 주체로 의존성을 주입해 a에 어떤 객체를 주입할지 결정하게 됩니다.
A1 a = new A1();
// ↓↓↓↓↓
A a = new A1();
A a = new A2();
// A(인터페이스) A1, A2 (A의 구현체)
위와같이 인터페이스를 통해 결합하므로써 결합을 느슨하게 만든다는 개념입니다.
2. DI(Dependency Injection)
DI는 객체간의 의존성을 가지고 있게 만드는게 아니라 의존성을 (클래스)외부에서 만들어 주입시켜준다는 뜻입니다.
// 1번
public class A {
B b;
void setB(){
b = new B();
}
}
1번 코드는 A내에서 B를 생성하여 b에 초기화 하고 있습니다. 여기서 b는 A에 완전히 종속이 되어 있는 것이죠.
//2번
public class A {
B b;
void setB(B b){
this.b=b;
}
}
2번 코드는 외부에서 B를 생성하여 setB 메서드를 이용하여 b를 setting하고 있습니다. 이는 A에 B를 외부에서 주입한다. 즉, 의존성주입(DI)가 되는 것입니다.
// 1번
A a = new A();
a.setB();
// 2번
A a = new A();
B b = new B();
a.setB(b);
즉 외부에서 보면 위와 같은 과정을 통해 b를 초기화 할 수 있는 것이죠
이것만 보면 1번이 더 간단해 보일 수 있습니다. setB()가 아닌 생성자를 통해 b를 초기화 한다면 a.setB()마저 없어도 괜찮기 때문이죠. 하지만 이것은 단지 DI의 개념일 뿐입니다. 갈길이 멀어요
IOC 개념을 알고나면 이해가 조금 가실 수 있을 겁니다.
3. IOC(Inversion Of Controll)
객체간 결합성을 낮추기 위한 최종적인 목표입니다. IOC를 하기 위해서 DI가 필요한것이었죠.
IOC란 프로그램의 제어가 프로그래머에서 Framework로 넘어간 것을 말합니다.
스프링이 제어를 하며 사전 설정에서 어떤 객체가 어떤 객체에 주입되는지를 설정해 놓으면 Framework가 xml이나 Annotation을 통해 적절히 주입시키는 것입니다.
즉, 이렇게 어떤 객체가 주입되는 객체이고 어떤 클래스에 주입이 되는 것인지를 설정해 놓으면 DI설명의 2번 코드와 같이 직접적으로 B를 생성해서 주입하거나 1번과 같이 완전히 결합해 놓는 일이 없어집니다.
개발자는 그저 A와 B를 만들어 놓고 A클래스의 b 필드는 B클래스를 주입 받는다는 것과 B는 스프링의 IOC 컨테이너가 관리해라! 정도만 설정해 주면 되는 것입니다.
이해가 안 가신다면 블로그 글을 차례로 따라오시면 IOC 개념이 쓰인 곳에 표기를 해 두겠습니다.
'개발 > Spring Framework' 카테고리의 다른 글
1.[Spring Framework] 개론 및 공부(업로드) 목적 (1) | 2021.04.30 |
---|
댓글