IOC
Inversion of Control
제어권이 뒤바뀐다.
원래는 자기가 사용할 의존성은 자기가 만들어 사용한다.
Ex) new로 생성해서 사용하는 것
Ioc는 사용하지만 만들지 않는다. 즉 누군가가 생성해준다.
누군가란? 스프링
Ex) new를 사용하지 않는다.
의존성 주입 예제
스프링에서 의존성을 주입해준다.(생성자 방식)
private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
//vistis 는 생략 this.visits = visits;
}
만약 IoC가 적용 안되었다면?
이런 식으로 사용하면 원래 Null point Exception 에러가 난다.
Spring이 관리하는 객체를 Bean이라고 함.
즉, 스프링이 빈 객체를 생성해 주입해줘서 동작되게 한다.
결론 : IoC에서 객체 생성은 내가 하는 것이 아닌 스프링이 필요한 의존성을 주입해준다.
IOC 컨테이너(Bean Factory) ApplicationContext
Bean Factory이 IOC 컨테이너인데 ApplicationContext는 BeanFactory를 상속받는다.
IOC컨테이너 역할
bean 생성하고 bean들 사이에 의존성을 엮어주고 스프링에 제공해준다.
OwnerController, OwnerRepository 등 즉 컨트롤러, 레파지토리 등은 빈으로 등록해 사용한다.
모든 클래스가 다 무조건 bean으로 등록되는 것이 아니다.
@Controller 등
@으로 등록하는 방식,
extends Repository 상속하는 방식,
@Bean으로 등록하는 방식 등
여러 가지 방법으로 Bean으로 설정이 가능하다.
의존성 주입은 bean끼리만 사용한다. 예외의 경우 다른 객체에 할 수 있지만 거의 하지 않는다.
즉, 주로 IOC컨테이너 안에 있는 객체에만 서로 의존성 주입을 한다.
IOC컨테이너는 매번 새로 객체를 생성하는 것이 아니라 생성된 객체를 같이 사용한다.
Bean
IoC 컨테이너가 관리하는 객체를 말한다.
ApplicationContext가 만들어서 그 안에 담고 있는 객체를 말한다.
Component Scannig
-@Controller
-@Service
-@Repository
-@Component
등 여러 가지 등을 찾아서 bean으로 등록한다.
ex)
public interface OwnerRepository extends Repository<Owner, Integer>
Repository를 보면 특정한 @이 없더라도 특정 인터페이스를 상속받는 클래스를 찾아서
내부에서 인터페이스를 구현하고 Bean으로 등록한다.
직적 Bean으로 등록
@Configuration과 @Bean으로 등록할 수 있다.
@Configuration(proxyBeanMethods = false)
@EnableCaching
class CacheConfiguration {
@Bean
public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() {
return cm -> {
cm.createCache("vets", cacheConfiguration());
};
}
}
@Autowried로 IoC컨테이너에서 객체를 꺼내 사용할 수 있다.
의존성 주입(Dependency Injection)
@Autowried로 보통 주입을 한다.
생성자
스프링 4.3부터 이상부턴 생성자에서 생략하고 사용할 수 있다.
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
,
필드
@Autowired
private final OwnerRepository owners;
, set
public void setOwners(OwnerRepository r){
this.owners = r;
}
등으로 주입할 수 있다.
주의점 : final로 생성하면 무조건 생성하거나 생성자를 만들어야 한다.
생성자를 생성하자 않고 @Autowried로 생성자 주입도 가능하다. (자주 사용하는 방법)
bean으로 등록되어있지않으면 의존성주입은 불가능하다.
'개발 소발 > 개발 Spring' 카테고리의 다른 글
Spring Autowired와 ComponentScan이란 (0) | 2020.07.10 |
---|---|
AOP란? AOP 기초개념 (0) | 2020.07.09 |
프레임워크 개념 (0) | 2018.01.26 |
SpringMVC란? (0) | 2018.01.11 |
MVC패턴이란? (0) | 2018.01.11 |