Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

MyPrograming

Spring IOC / DI 본문

Java/Spring

Spring IOC / DI

SeongWon 2021. 11. 19. 20:24
반응형

IOC (Inversion Of Control) ?

 

IOC란, 해석하면 제어의 역전이다. 즉, 제어권이 역전 혹은 기존의 제어방식을 뒤집었다는 말이다.

객체에 대한 제어권이 개발자가 아닌 컨테이너로 넘어가 객체의 생성부터 생명주기 관리까지 전부 컨테이너가 맡아서 처리하기 때문에 제어권을 컨테이너가 갖고 있다.

 

컨테이너가 직접 Bean을 생성 / 관리하기 때문에 개발자는 new 등으로 선언하지 않아도 됨으로써 

각 클래스들의 의존성을 줄여준다.

 


 

<IOC 관련 개념용어>

 

1) Bean

: 스프링에서 제어권을 가지고 직접 만들어 관계를 부여하는 오브젝트

스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 빈은 아니다. 스프링의 빈은 스프링 컨테이너가 생성하고 관계 설정, 사용을 제어해주는 오브젝트를 말한다.

 

2) Bean factory 

: 스프링의 IOC를 담당하는 핵심 컨테이너

Bean을 등록, 생성, 조회, 반환, 관리한다. 보통 Bean factory를 바로 사용하지 않고 이를 확장한 application context를 이용한다. BeanFactort는 bean factory가 구현하는 interface이다. ( getBean() 등의 메서드가 정의되어 있음 )

 

3) ApplicationContext

: bean factory를 확장한 IOC 컨테이너

BeanFactory 인터페이스를 상속받는 ApplicationContext는 BeanFactory가 제공하는 등록, 생성, 조회, 반환, 관리 기능 외에 AOP, 메세지 처리, 이벤트 처리 등의 기능을 제공한다. 모든 Application 구현체는 BeanFactory의 기능을 모두 제공하므로, 특별한 경우를 제외하고는 ApplicationContext를 사용하는 것이 바람직하다.

 

4) Configuration metadata

: ApplicationContext 혹은 BeanFactory가 IOC를 적게 사용하기 위해 사용하는 메타정보

스프링의 설정 정보는 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, 주로 Bean을 생성 / 구성하는 용도로 사용한다.

 

5) Container (IOC Container)

: IOC 방식으로 Bean을 관리한다는 의미에서 BeanFactory나 ApplicationContext를 가리킨다.

Application Context는 그 자체로 ApplicationContext 인터페이스를 구현한 오브젝트를 말하기도 하는데, 하나의 애플리케이션에 보통 여러 개의 ApplicationContext가 만들어진다. 이를 통칭해서 Spring Container라고 부를 수 있다.

 


DI (Dependency Injection) ?

 

아래의 그림처럼 IOC를 구현하는 방법으로 DL, DI의 2가지 방법이 존재한다.

 

 

1) DL (Dependency Lookup)  의존성 검색

: 컨테이너에서 제공하는 API를 이용해 사용하고자 하는 Bean을 저장소에서 Lookup하는 것을 말한다.

 

2) DI (Dependency Injection)  의존성 주입

: 각 객체간의 의존성을 컨테이너가 자동으로 연결해주는 것으로 개발자가 Bean 설정 파일에 의존관계가 필요한 정보를 추가해주면, 컨테이너가 자동적으로 연결해준다.

 


 

Spring Framework 에서는 Setter Injection, Constructor Injection의 2가지 방식이 있다.

 

Setter Injection

 

Setter Injection은 인자가 없는 생성자를 사용하여 객체를 생성한 후, setter 메소드를  사용하여 의존성을 주입하는 방식으로 <property/> element를 사용한다. 객체가 생성되고 의존성을 삽입하는 방식으로 유연하게 구현할 수 있으며, setter 메서드를 통해 값이 할당되기 전까지 객체를 사용할 수 없다.

 

public class BeanExample {
 
    private MyBean beanOne;
    private YourBean beanTwo;
    
    public void setBeanOne(MyBean beanOne){
        this.beanOne = beanOne;
    }
    
    public void setBeanTwo(YourBean beanTwo){
        this.beanTwo = beanTwo;
    }
    
    public void setIntegerProperty(int i){
        this.i = i;
    }
    
}

 

<bean id="BeanExample" class="example.BeanExample">
    <property name="beanOne"><ref bean="MyBean"/></property>
    <property name="beanTwo" ref="YourBean" />
    <property name="IntegerProperty" value="1"></property>
</bean>
 
<bean id="MyBean" class="example.MyBean" />
<bean id="YourBean" class="example.YourBean" />

 

 

Constructor Injection

 

Constructor Injection은 인자를 갖는 생성자를 사용하여 의존성을 주입하는 방식으로 <constructor-arg/> element를 사용한다. 생성자에 파라미터를 지정함으로써 객체가 필요로하는 값을 알 수 있으며 setter 없이 간단하게 지정이 가능하다.

 

public class BeanExample {
 
    private MyBean beanOne;
    private YourBean beanTwo;
    private int i;
    
    public BeanExample(MyBean beanOne, YourBean beanTwo, int i){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.i = i;
    }
}

 

<bean id="BeanExample" class="example.BeanExample">
    <constructor-arg name="beanOne"><ref bean="MyBean"/></constructor-arg>
    <constructor-arg name="beanTwo" ref="YourBean" />
    <constructor-arg name="IntegerProperty" value="1"/>
</bean>
 
<bean id="MyBean" class="example.MyBean" />
<bean id="YourBean" class="example.YourBean" />
반응형

'Java > Spring' 카테고리의 다른 글

Java Bean & Spring Bean  (0) 2021.11.19