Old Branch

Spring Framework Documentation - IoC Container - 1

woolbro 2019. 6. 18. 13:36
반응형

이전포스팅입니다 :)

[Java/Spring-framework] - Spring Framework Documentation -2 (Eclipse STS, IntelliJ)

 

Spring Framework Documentation -2 (Eclipse STS, IntelliJ)

이전 포스팅입니다 [Java/Spring-framework] - Spring Framework Documentation -1 Spring Framework Documentation -1 Spring Framework에 대해서 공부해 보려고 합니다(진지). 우선, 참고한 문서는 Spring Frame..

woolbro.tistory.com

 

Spring Framework 에서는 필수적인 기술 중 하나로, IoC Container 가 가장 중요하다고 얘기하고 있습니다.

 

이번 포스팅에서는 IoC Container에 대해서 얘기 해 보겠습니다.

 

우선 IoC Container를 얘기하기 전에, IoC가 무엇인지 부터 알아보도록 하겠습니다.

 

IoC란?

IoC(Inversion of Control) 란, 제어의 역전이라고 해석 될 수 있습니다. "종속성 주입(DI)" 라고도 하는데, 말 그대로 프로그램 제어의 흐름 구조가 바뀌는 것입니다. 

 

일반적으로 메인 메서드나 메인 클래스에서 사용할 오브젝트를 생성하고, 결정하는데요. 또한 그렇게 생성되어진 오브젝트 내의 메소드를 호출하는 작업을 반복합니다. 

 

이렇게 되면, 각 오브젝트는 프로그램의 흐름에 있어서, 직접적으로 그 흐름에 참여하게 되는데, 다시말하면 

 

"모든 종류의 작업을 사용하는 쪽에서 제어하는 구조" 인 셈이죠.

 

IoC의 개념모든 종류의 작업을 사용하는 쪽에서 제어하는 구조반대로 가는 형태입니다.

 

IoC에서 오브젝트는 자신이 사용할 기능을 스스로 생성하거나 선택하지 않고, 어떻게 생성되고 어디서 사용되는지 알 수 없는 개념입니다. 즉, 모든 제어 권한을 오브젝트 자신이 아닌 다른 대상에게 위임 하는 것입니다.

 

IoC(Inversion of Control)는 서비스 제어의 흐름을 역전시켰다는 뜻으로, 개발자가 아닌 프레임워크가 흐름을 제어하는 주체가되어 필요할때 코드를 호출하며 사용하게됩니다.

 

Spring에서 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 Bean이라고 부릅니다. 

 

위의 그림은 스프링 공식 문서에서 가져온 그림입니다. 스프링의 동작하는 과정을 보여 주는데요, 응용프로그램 클래스가 메타 데이터와 결합되어 ApplicationContext가 작성되고 초기화 된 후에 완전히 실행 가능한 시스템 or 응용 프로그램을 갖게 됩니다.

 

스프링은 이러한 객체들간의 의존성을 줄이기위한 방법으로 IoC/DI를 하나로 묶어서 제공을 하고 있습니다. 객체 선언과정을 스프링 프레임워크가 미리 대신 해줌으로써(IoC) 그저 객체를 가져다가 (DI) 사용 할수 있게 해줍니다. 

 

DI의 예를 들면 아래와 같습니다.

//DI Example
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    public SimpleMovieLister(MovieFinder movieFinder) {
      this.movieFinder = movieFinder;
    }
	
}

하나의 객체가 다른 객체를 참조 할 떄 객체간의 의존성을 갖는다고 말합니다.

 

SimpleMovieLister 객체는 생성자에서 MovieFinder 오브젝트를 받으면서 MovieFinder 오브젝트에 의존성을 갖게 되었습니다. 즉, 하나의 객체의 변화에 대해 다른객체에 영향을 끼칠 수 있게 되었다는 뜻입니다.

 

의존성 주입에도 종류가 있는데요, Setter injection, Constructor Injection, Method Injection이 있습니다.

 

  • Setter Injection
    1. 인자가 없는 생성자나 인자가 없는 static factory 메소드가 bean을 인스턴스화 하기 위해서 호출 된 후에 bean의 setter 메소드를 호출하여 실체화 하는 방법
    2. 객체를 생성 후 의존성 삽입 방식 이기 떄문에 구현시에 좀 더 유연하게 사용
    3. setter를 통해 값이 지정되기 전 까지 객체를 사용 할 수 없음
    4. Spring 프레임워크의 bean 설정 파일에서 property 사용

<xmlfile>

<!-- XML Congiguration -->
<bean id="testBean" class="test.Example_Bean">
	<property name = "bean_one">
    	<ref bean = "someExample_Bean"/>
    </property>
    <!--setter injection using the neater 'ref' attribute -->
    <property name = "bean_two" ref= "numberB"/>
    <property name = "integerProperty" value="10"/>
</bean>

<bean id="someExample_Bean" class="test.numberA"/>
<bean id="numberB" class="test.numberB"/>

 

<javafile>

// Java
public class Example_Bean{
	
    private numberA bean_one;
    private numberB bean_two;
    private int i;
    
    public void setBean_one(numberA bean_one){
    	this.bean_one = bean_one;
    }
    
    public void setBean_two(numberB bean_two){
    	this.bean_two = bean_two;
    }
    
    pubic void setIntegerProperty(int i){
    	this.i = i;
    }
}

 

 

  • Constructor Injection
    1. 생성자를 이용하여 클래스 사이의 의존 관계를 연결
    2. Setter 메소드 제공하지 않음으로 필드를 불변 값으로 지정
    3. 2 때문에 생성자의 파라미터가 많을 경우 코드가 복잡 해 보일 수 있다
    4. Spring 프레임워크의 bean 설정 파일에서 constructor-arg 사용

<xmlfile>

<!-- XML Congiguration -->
<bean id="testBean" class="test.Example_Bean">
	<constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
    <constructor-arg ref="yetAnotherBean"/>
    	<!-- <constructor-arg><ref bean="yetAnotherBena"/></constructor-arg> 위와 동일 -->
    <constructor-arg type ="int" value="10"/>
</bean>

<bean id="anotherExampleBean" class="test.AnotherBean"/>
<bean id="yetAnotherBean" class="test.YetAnotherBean"/>

 

<javafile>

// Java
public class Example_Bean{
	private AnotherBean beanOne;
	private YetAnotherBean beanTwo;
    private int i;
    
    public ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int){
    	this.beanOne = anotherBean;
        this.beanTwo = yetAnotherBean;
        this.i = i;
    }
        
}

 

  • Method Injection
    1. Singleton 인스턴스와 Non Siglenton 인스턴스의 의존 관계를 연결 시킬 필요가 있을 경우 사용

 

IoC용어 정리

bean - 스프링에서 제어권을 가지고 직접 만들고 관계를 부여하는 객체

bean factory - 스프링의 IoC를 담당하는 컨테이너

application context - bean factory를 확장한 IoC 컨테이너

configuration metadata - application context 혹은 bean factory가 IoC를 적용하기 위해 사용하는 메타정보

container(IoC container) - IoC방식으로 bean을 관리한다는 의미에서 bean factory나 application context를 가리킴

 

 

클래스 호출 방식 

  • 일반적인 클래스 호출

 

  • 인터페이스를 통한 호출

 

  • 팩토리 패턴을 이용한 호출

 

 

  • IoC를 이용한 호출