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

IoC,DI란?


Ioc

DI

Spring Di 컨테이너


IoC(제어의 역전)란?

- 제어권이 바뀐다.(사용자가아님 프레임워크가 제어권을가진다.(컨테이너))

- 개발자가 객체직접생성하지않는다.(컨테이너가 생성된다.)


IoC 의존관계를 결정,설정,생명주기를 해결하기위한 디자인패턴


IoC가아닌경우

-사용자가 New로 생성한다.

ex)


IoC이면

-new 생성직접안한다.

ex)


IoC컨테이너(제어권 가지고있음)

-객체 생성 생명주기 관리한다.

-의존성관리.

-POJO의 생성,초기화,서비스,소멸에 대한 권한을 가진다.


IOC분류

DL

DI


DL 의존성 검색(특정 컨테이너에 종속되는API사용)

- 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는것이다.

- 컨테이너가 제공하는 API를사용하기때문에 컨테이너에 종속성이 늘어난다.

- EJB

- Spring

DI 의존성 주입(주로 많이사용)

-각 클래스간의 의존관례를 빈설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는것이다.

-spring

-PicoContainer

-SetterInjection(셋터통해 주입)

-Constructor(생성자통해 주입)

-Method(자바메서드통해주입)



DI개념(의존관계주입)

-의존관계 빈설정(사용자가 설정해줌) 어노테이션등등이 있다.

-컨테이너가 정보들을읽고 자동으로 설정해준다.

개발자의 역할

-의존관계 설정해준다. (어노테이션)

ex)



컨테이너가 흐름의 주체가 된다.(사용자가 설정해준것을 컨테이너가 연결한다.)


장점

-코드가 단순해진다.

-컴포넌트 간의 결합도가 제거된다.

ex)컨트롤러에서 서비스호출 New로 하지않는다.


3가지 유형

-SetterInjection (셋터통해 주입)

-Constructor (생성자통해 주입)

-Methodinjection (자바메서드통해주입)


클래스 호출방식

클래스->인터페이스->구현클래스

연결은 호출이 아닌 XML(설정파일)읽어와 의존성을 삽입해준다.

SetterInjection(한번에 한개씩) 

beans.xml

Hello.java


Constructor Injection(생성자생성)

beans.xml


Hello.java



Spring DI 컨테이너

- Spring DI컨테이너가 관리하는 객체를 빈(bean)이라고 하고, 

빈(bean)들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부른다.

- SpringAPI에서 BeanFactory 인터페이스제공한다.

- BeanFactory에 여러가지 컨테이너 기능을 추가하여 애플케이션 컨텍스라고부른다.


BeanFactory 

- Bean을 등록,생성 조회,반환 관리한다.

- 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.

- getBean() 메서드가 정의되어있다.

ApplicationContext  <-DI컨테이너 역할을한다.

- Bean을 등록,생성,조회,반환 관리하는 기능은 BeanFactory와 같다.

- Spring의 각종 부가 서비스를 추가로 제공한다.

- Spring이 제공하는 ApplicationContext 구현 클래스가 여러가지 종류가있다.



'개발 소발 > 개발 Spring' 카테고리의 다른 글

Bean등록 및 메타정보구성이란?  (0) 2017.11.21
bean,properties설정이란?  (0) 2017.11.20
Junit,Spring-Test란?(의존성예제)  (0) 2017.11.20
STS,maven이란?  (0) 2017.11.20
Spring프레임워크란?  (0) 2017.11.20

+ Recent posts