IoC(Inversion of Control)란?
애플리케이션 흐름의 주도권을 개발자가 아닌
Spring이 갖는다.
Java 콘솔 애플리케이션 일반적인 제어권 --> 개발자에게!
ex)
public class Example2_10 {
public static void main(String[] args) {
System.out.println("Hello IoC!");
}
}
main() 메서드로 객체 메서드 호출...
개발자 작성 코드를 순차적으로 실행
↕
반대로,
웹에서 동작하는 애플리케이션 경우
클라이언트(User)가 외부에서 접속해서 사용! --> main() 메서드가 종료되면 안된다.
서블릿 컨테이너에는 서블릿 클래스들 有..
별도의 main() 메서드는 無
↓
main() 메서드도 없는데 어떻게 애플리케이션이 실행되는지?
↓
클라이언트의 요청이 들어올 때마다
컨테이너 내의 컨테이너 로직이 서블릿을 직접 실행시켜 줌!
주도권 => 서블릿 컨테이너 (IoC 적용ed)
↓
그럼 Spring에는 이 IoC 개념이 어떻게 적용되어 있을까?
바로 DI (Dependency Injection)을 통해서!!!
DI (Dependency Injection) 란? = 의존성 주입
IoC 개념을 조금 구체화 시킨 것
객체간의 관계를 느슨하게 해줌
What : 의존성 주입은 무엇인가?
A 클래스에서 B 클래스의 기능을 사용하기 위해
B 클래스의 메서드를 호출함
== A 클래스는 B 클래스에 의존한다
(B클래스는 A클래스의 부품이다)
클래스끼리는 사용하고자 하는 클래스의 객체를 생성해서 참조하게 되면
의존 관계가 성립하게 된다 (!= 의존성 주입)
⬇
의존성 주입 = 생성자를 통해 클래스의 객체를 전달 받는 것
(생성자의 파라미터로 객체를 전달함!! = 외부에서 객체 주입함)
Why : 의존성 주입은 왜 필요한가?
= 객체 간의 관계를 느슨하게 해주기 때문에
강한 결합(Tight Coupling) = new 키워드로 의존 객체 생성할 경우
애플리케이션 코드 내부에서 직접적으로 new 키워드 사용할 경우
객체지향 설계 관점에서 중요한 문제 발생!
(코드 수정시에 관련 클래스 일일히 하나하나 바꿔줘야 할수도..)
So, 느슨한 결합(Loose Coupling) 이 필요하다!
How : 느슨한 의존성 주입은 어떻게 할 수 있나?
인터페이스(Interface)를 사용한다! (+업캐스팅을 통해)
느슨한 의존성 주입 : 어떤 클래스가 일반화된 구성요소 (ex.인터페이스)에 의존하고 있을때!
주입받은 대상이 A 인터페이스 일 경우 A 인터페이스 구현한 어떤 클래스도 주입 받을 수 있음
Who : 누가 Spring 기반 애플리케이션에서 의존성 주입을 해주나?
= Spring
Spring에서 의존 객체들을 주입해주기 때문에 애플리케이션 코드를 유연하게 작성 가능하다.
ex) config 클래스 - 애노테이션 등으로 new 키워드 없애줄 수 있음 (느슨한 결합)
'Spring' 카테고리의 다른 글
[Spring] 아키텍쳐(Architecture)란? / Spring Framework 모듈 구성 보기 (0) | 2022.10.12 |
---|---|
[Spring] PSA 란? (Portable Service Abstraction) (0) | 2022.10.12 |
[Spring] AOP란? (Aspect Oriented Programming) (0) | 2022.10.12 |
[Spring] POJO란? (Plain Old Java Object) (0) | 2022.10.11 |
[Spring] Spring Framework란? / Framework과 Library의 차이 (1) | 2022.10.11 |
댓글