DI, IoC, 스프링 컨테이너, Bean
참조 링크
- IoC 컨테이너란?
- DI, IoC 정리
- IoC, DI, Spring Container, Bean 정리
DI(Dependency Injection)
- 의존관계 주입 기능
- 객체를 직접 생성하는 것이 아닌 외부에서 생성 후 주입시키는 방식
- DI를 통해 모듈간의 결합도가 낮아지고, 유연성 상승
IoC(Inversion of control, 제어반전)
- 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미
- 컴포넌트 의존관계 설정, 설정 및 생명주기를 해결하기 위한 디자인 패턴
- 기존의 객체 생성 과정
- 객체 생성
- 의존성 객체 생성(클래스 내부에서 생성)
- 의존성 객체 메소드 호출
- 스프링에서의 객체 생성 과정
- 객체 생성
- 의존성 객체 주입(제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입)
- 의존성 객체 메소드 호출
예시
- 방법 1: A객체가 B와 C객체를 New 생성자를 통해서 직접 생성
class A{
private B b = new B();
private C c = new C();
}
- 방법2: 외부(IoC 컨테이너)에서 생성된 객체를 주입시켜 setter() or 생성자를 통해 사용
class A{
private B b;
private C c;
public A(B b, C c){
this.b = b;
this.c = c;
}
}
class ATest{
B b = new B();
C c = new C();
A a = new A(b, c);
}
방법 1에서는 B, C 객체의 제어권이 A객체에 있었다면, 방법 2에서는 B, C 객체의 제어권이 ATest객체에 있다.
→ 이처럼 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IoC라 하며, 의존성을 외부에서 주입시켜 주는 것을 DI라고 한다.
컨테이너
- 개발자가 작성한 코드의 처리과정을 위임받은 독립적인 존재 → 적절한 설정이 되어있다면 개발자가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해줌
- 객체관리 주체가 개발자가 아닌 프레임워크(Container)가 됨 → 개발자는 로직에 집중
- 객체 생성 코드가 없으므로 테스트 주도 개발(TDD)이 용이
IoC컨테이너(= 스프링 컨테이너)
- IoC컨테이너(= 스프링 컨테이너): 스프링에서 객체를 생성, 관리, 책임, 의존성관리 등을 해주는 컨테이너
- 스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 컴포넌트들을 관리한다. 이때 스프링 컨테이너에서 생성되는 객체를 Bean이라고 한다.
Bean
- Bean은 Spring Bean Container에 존재하는 객채를 말한다.
- Bean Container는 의존성 주입을 통해 Bean객체를 사용할 수 있도록 해준다. Bean은 보통 싱글턴으로 존재한다.
- Beans는 우리가 컨테이너에 공급하는 설정 메타 데이터(XML파일)에 의해 생성된다.
Bean 생성 방법
-
@ComponentScan 방식
@ComponentScan은 @Component 어노테이션이 부여된 class를 찾아 자동으로 Bean에 등록해주는 역할을 한다.(@Repository, @Service, @Repository 어노테이션 안에 @Component 어노테이션이 부여되어있어서 위의 어노테이션이 있는 class도 Bean으로 등록된다.)
스프링부트로 어플리케이션을 만들게되면 가장 상위 클래스에 @SpringBootApplication이 있는데, @SpringBootApplication를 구현한 코드에 보면 @ComponentScan 어노테이션이 붙어있다.
-
@Configuration에서 @Bean으로 등록
@Configuration
public class HttpConfig {
@Bean
public RestTemplate createRestTemplate(){
return new RestTemplate();
}
}