IoC(Inversion of Control)
>의미
: '애플리케이션 흐름의 주도권을 Spring이 갖는다'를 의미함.
특정 클래스에서 new 키워드를 통해 다른 클래스의 객체를 생성하고 이를 참조하면, 의존 관계가 성립됐다고 볼 수 있다.
객체A가 객체B를 사용해야 할 때, 객체A는 객체B에 의존성이 있다.
이런 경우, 객체A 내에 객체B의 인스턴스, 즉 `new 객체B( )`를 통해서 의존성을 개발자가 만들어 쓴다.
하지만, IoC(제어권 역전)가 일어난 상황에서는 의존성을 개발자가 new를 통해 만들지 않고 외부에서 가져온다.
여기서 '외부'란, 직접적으로 객체를 제공하는 환경(클래스)을 의미한다.
DI(의존성 주입)는 의존성을 외부에서 가져올 뿐만 아니라, 아예 생성자를 통해 주입받는 경우이다.
즉, 외부에서 객체B를 객체A의 생성자의 인자로 전달하는 것이다.
DI는 IoC의 일종 혹은 구체화된 특징이라고 할 수도 있다.
: 다르게는 의존성을 누가 관리하느냐에 따른 제어권을 핵심으로 볼 수 있다.
의존 관계를 수정할 때마다 개발자가 코드를 수정하고 작업해야하는 것이 일반적인 프로그램의 흐름이다.
하지만 역전 관계는 이런 흐름이 역전되어, Spring이 알아서 하도록 책임(제어권)을 넘기는 것이다.
어찌보면 코드 수정에 자동화(편리함)을 꾀하는 것으로도 볼 수 있다.
A가 B에 의존할 때, 원래는 A는 B를 알아야만 사용할 수 있다. 하지만 IoC가 된 상황이라면 A가 무엇을 의존하는지 상관없고 알 필요도 없는 상태가 된다. Spring이 알아서 해주기 때문이다.
DI(의존성 주입)은 결합도를 낮추는 방법(원칙)으로, IoC 원칙을 지키기 위한 많은 방법 중 하나라고 보면 된다.
//편한 설명으로 이해하자.
>강한 결합(Tight Coupling)
: new 키워드를 통해 의존성 주입이 된 클래스에 의존 관계가 성립하는 것을 강한 결합이라고 표현한다.
: 강한 결합을 사용하면 이후 새로운 의존 관계를 만들어야 하거나, 코드를 수정해야 할 경우 더 많은 작업을 해야만 할 것
이다.
: 위 문제를 상속 관계로 의존 관계를 도울 순 있겠지만, 자바는 단일 상속만 지원하기 때문에 궁극적인 해결을 할 수는 없다.
>느슨한 결합(Loose Coupling)
: 강한 결합을 극복하기 위해서 생긴 방법
: 인터페이스를 이용하여 상속이 아닌 구현 관계를 성립시키는 것이 느슨한 결합의 핵심이다.
: 클래스 간 의존 관계가 이루어지면 강하게 결합될 수 밖에 없지만, 클래스를 인터페이스를 매개로 의존 관계를 이루게하면 결합이 한 층 느슨해진다.
: 인터페이스를 생성자에 주입 받는다면, 해당 인터페이스의 구현 클래스라면 어떤 클래스든 주입 받을 수 있다. (다형성)
: 나아가서 의존성 주입을 new가 아닌 Spring의 도움을 받아 더욱 느슨한 관계로 바꿀 수 있다. (애너테이션 사용)
//IoC 컨테이너, ApplicationContext(interface), Bean 을 알아두고 추후 더 공부하자.
'코드스테이츠_국비교육 > [Section2]' 카테고리의 다른 글
35.01_[Spring] Spring Framework_아키텍쳐 개요_22.10.12 (0) | 2022.10.12 |
---|---|
34.06_[Spring] Spring Framework_AOP, PSA_22.10.11 (0) | 2022.10.11 |
34.04_[Spring] Spring Framework 주요 특징&POJO_22.10.11 (0) | 2022.10.11 |
34.02_[Spring] Spring Framwork_22.10.11 (0) | 2022.10.10 |
34.01_[Spring] Framwork, Library_22.10.11 (0) | 2022.10.10 |