IoC(Inversion Of Control) Container란?
객체가 생성될 때, 그 객체와 관련 있는 다른 객체들의 의존성 주입을 가능하게 하는 Spring Framework에서 AOP(Aspect Oriented Programming)를 구현할 수 있는 ApplicationContext 인터페이스입니다.
스프링 공식 문서에서는 IoC 컨테이너에 대해서 아래와 같이 설명하고 있습니다.
It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.
이 문장은 객체들이 자신의 의존성(그들과 함께 일하는 객체들)을 오직 생성자나 팩토리 메서드에 전달하는 인자(인수) 혹은 팩토리 메서드에서 생성되거나 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 정의하는 과정이다 정도로 해석됩니다.
컨테이너는 빈을 생성할 때 의존성을 주입하기 때문에, 이러한 방식은 클래스의 직접 구성 또는 Service Locator 패턴 같은 방식을 사용하여 종속성의 인스턴스화 또는 위치를 제어하는 bean 자체의 반대입니다.
즉 컨테이너가 빈을 생성할 때 의존성을 제어할 수 있기 때문에 제어의 역전이라는 말이 붙은 것입니다.
IoC 컨테이너인 ApplicationContext 인터페이스가 상속받는 인터페이스인 BeanFactory에 대한 자세한 내용은 이글의 주제를 벗어나므로 아래 글을 참고 부탁드립니다.
https://limminjeong98.tistory.com/460
Bean이란?
Bean은 Spring IoC 컨테이너가 관리하는 객체입니다.
Spring에서는 애플리케이션의 뼈대를 형성하고, IoC 컨테이너가 관리하는 객체들을 bean이라고 부릅니다. bean은 Spring IoC 컨테이너에 의해 인스턴스화되고, 조립되고, 관리됩니다.
bean은 컨테이너에 제공한 구성 메타데이터(xml의 <bean/> 정의 등에서)를 통해 생성됩니다.
Bean 등록과 생성과정에 대한 자세한 내용은 이글의 주제를 벗어나므로 아래 글을 참고 부탁드립니다.
https://limminjeong98.tistory.com/461
Dependency Injection이란?
객체들이 자신의 의존성을 생성자 또는 팩터리 메서드에 전달하는 인자(인수) 혹은 팩토리 메서드에서 생성되거나 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 정의하는 과정입니다.
컨테이너가 빈을 생성할 때 이러한 의존성을 주입하며, 이러한 과정은 빈 스스로 의존성을 제어하는 패턴과 근본적으로 반대입니다.
DI 원칙을 사용한 코드는 더 깔끔하고, decoupling(객체 간의 결합도를 낮추는 것) 또한 효과적입니다.
객체는 자신의 의존성을 찾을 필요가 없기 때문에, 의존대상의 위치나 클래스에 대해서 전혀 모릅니다. 결과적으로 테스트하기 쉬운 클래스를 만들 수 있는데 특히 인터페이스나 추상 클래스에 의존할 경우 단위 테스트에서도 의존성을 주입하여 stub, mock 객체를 구현할 수 있습니다.
Dependency Injection에는 크게 2가지 방법이 있는데, 하나는 Constructor(생성자) 기반 의존성 주입이고 다른 하나는 Setter(수정자) 기반 의존성 주입입니다. 일반적으로 실행 도중에 의존성을 변경할 필요가 없다면 예기치 못한 변경 가능성을 최소화하기 위해 생성자를 기반으로 의존성을 주입하는 방법을 사용하는 것이 좋습니다.
의존성 주입 방법에 대한 내용은 이글의 주제를 벗어나므로 아래 글을 참고 부탁드립니다.
https://limminjeong98.tistory.com/458
참고 자료
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans
Core Technologies
In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do
docs.spring.io
'Spring Framework' 카테고리의 다른 글
@Bean과 @Component 사용하는 이유와 사용하는 방법. 차이점. (0) | 2022.03.17 |
---|