제어의 역행 / 의존성 주입(Inversion of Control / Dependency Injection)

-       스프링 프레임워크가 지원하는 핵심 기능 하나이다.

-       객체 사이의 의존관계가 객체 자신이 아닌 외부에 의해 설정된다는 개념이다.

-       컨테이너는 어떤 객체(A) 필요로 하는 의존관계에 있는 다른 객체(B) 직접 생성하여 어떤 객체(A) 주입(설정) 해주는 역할을 담당하게 된다.

 

스프링은 객체간의 의존성을 설정 파일로 쉽게 관리한다. 의존성 삽입은 크게 두가지 종류가 존재한다.

 

Setter Ijcection

-       bean setter 메소드를 이용한 의존관계 설정 방식이다. Spring은 많은 수의 생성자 인자를 다루기 어렵고, 몇몇 프라퍼티가 선택사항일 때 까다롭기 때문에 대개 setter 기반 의존성 삽입의 사용을 권장한다.

 

Constructor Injection

-       생성자를 이용한 의존관계 설정 방식이다.

 

 

DI Constructor Injection

의존하는 객체를 생성자를 통해서 전달 받는 방법.

1.     의존하는 객체를 전달받을 생성자를 작성한다.

2.     설정 파일에 <constructor- arg> 태그를 이용한다.

-        객체인 경우 <ref> 태그 이용

-        문자열이나 기본 데이터 타입이라면 <value> 태그 이용

 

GreetingServiceImpl.java

public class GreetingServiceImpl implements GreetingService {

 

           private String greeting;

           private int loopCount;

          

           public GreetingServiceImpl(String greeting, int loopCount) {

                     this.greeting = greeting;

                     this.loopCount =loopCount;

           }

 

}

 

applicationContext.xml

<bean id="greeting1" class="myspring.sample1.hello.GreetingServiceImpl">

           <constructor-arg index="0">

                     <value>Hello</value>

           </constructor-arg>

           <constructor-arg-arg index="1" type="int" value="3"/>

</bean>

 

-       생성자로 전달할 객체나 값이 여러개인 경우에는 <consturctor- arg>태그 반복하여 선언한다.

-       이때 선언한 순서대로 생성자의 매개변수로 전달된다.

-       순서를 명시하려면 index 속성을 이용한다. index 0부터 시작한다.

-       type을 명시하려면 type 속성을 이용한다.

 

 

DI – Setter Injection

setXxx() 형태의 설정 메소드를 통해서 전달받는 방법으로 프로퍼티 설정 방식이라고도 한다.

1.     의존하는 객체를 전달받을 setter 메소드를 작성한다.

2.     설정파일에 <property>태그를 이용한다.

-       객체인 경우 <ref>태그 이용

-       문자열이나 기본데이터 타입이라면 <value>태그 이용

-       생성자 오버로딩 시 기본 생성자가 반드시 필요하다.

 

GreetingServiceImpl2.java

public class GreetingServiceImpl2 implements GreetingService {

 

           private String greeting;

          

           public void setGreeting(String greeting) {

                     this.greeting = greeting;

           }

          

}

 

applicationContext.xml

<bean id="greeting2" class="myspring.sample1.hello.GreetingServiceImpl2">

           <property name="greeting">

                     <value>Hi</value>

           </property>

</bean>

 

 

DI – 컬렉션 타입의 프로퍼티 설정

태그

컬렉션 타입

<list>

java.util.List 배열

<set>

java.util.Set

<map>

java.util.Map

<properties>

java.util.Properties

 

-       컬렉션 원소가 객체인 경우 <ref> 태그 이용

-       컬렉션 원소가 기본타입인 경우 <value> 태그 이용

n  type 속성 이용하여 타입 지정 가능하다.

n  제네릭을 이용하면 타입 지정하지 않아도 된다.

 

GreetingServiceImpl5.java

public class GreetingServiceImpl5 implements GreetingService {

 

        private List greetingList;

       

        public void setGreetingList(List greetingList) {

               this.greetingList = greetingList;

        }

 

}

 

applicationContext.xml

<bean id="greeting5" class="myspring.sample1.hello.GreetingServiceImpl5">

        <property name="greetingList">

               <list>

                       <value>Hello</value>

                       <value>안녕</value>

                       <value>Hi</value>

               </list>

        </property>

</bean>

 

 

DI – 의존관계 자동 설정

-       의존하는 빈객체의 타입이나 이름을 이용하여 의존객체를 자동으로 설정할 있는 기능으로 4가지 방식 제공한다.

-       autowire속성을 이용한다.

-       자동설정과 직접설정의 혼합도 가능하다.

-        

방식

설명

byName

프로퍼티의 이름과 같은 이름을 갖는 빈객체를 설정한다.

byType

프로퍼티의 타입과 같은 타입을 갖는 객체를 설정한다.

constructor

생성자 파라미터 타입과 같은 타입을 갖는 객체를 생성자에 전달한다.

autodetect

Constructor 방식을 먼저 적용하고, 적용할 없을 경우 byType방식을 적용하여 빈객체를 설정한다.

 

GreetingServiceImpl3.java

public class GreetingServiceImpl3 implements GreetingService {

 

        private OutputService outputer;

       

        public void setOutputer(OutputService outputer) {

               this.outputer = outputer;

        }

       

}

 

applicationContext.xml

<bean id="greeting8" class="myspring.sample1.hello.GreetingServiceImpl3"

        autowire="byName" />

<bean id="outputer" class="myspring.sample1.hello.OutputServiceImplConsole" />

 

 

DI – 빈 객체 범위

-       기본적으로 컨테이너에 한 개의 빈 객체를 생성한다.

-       빈의 범위를 설정할 수 있는 방법을 제공한다.

-       scope 속성을 이용한다.

-        

방식

설명

singleton

컨테이너에 한 개의 빈 객체만 생성한다.(기본값)

prototype

빈을 요청할 때마다 빈 객체를 생성한다.

request HTTP

요청마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

session HTTP

세션마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

 

GreetingServiceImpl2.java

public class GreetingServiceImpl2 implements GreetingService {

 

        private String greeting;

       

        public void setGreeting(String greeting) {

               this.greeting = greeting;

        }

       

}

 

applicationContext.xml

<bean id="greeting2" class="myspring.sample1.hello.GreetingServiceImpl2"         scope="prototype">

        <property name="greeting">

               <value>Hi</value>

        </property>

</bean>

 

 

BeanFactory

빈 객체를 관리하고 각 빈 객체 간의 의존 관계를 설정해 주는 가장 단순한 컨테이너

인스턴스를 생성하고 설정하고 많은 수의 bean을 관리하는 실질적인 컨테이너이다. bean들은 일반적으로  서로 협력하고 그들 사이의 의존성을 가진다. 그 의존성은 BeanFactory에 의해 사용된 설정 데이터에 반영된다.

-       대표적인 구현 클래스

n  XmlBeanFactory

 

BeanFactory를 사용하여 객체 가져오기

Resource res = new ClassPathResource("applicationContext.xml");

BeanFactory factory = new XmlBeanFactory(res);

 

GreetingService bean = (GreetingService) factory.getBean("greeting");

 

 

ApplicationContext

-       BeanFactory 인터페이스를 상속받은 하위 인터페이스

-       BeanFactory의 빈관리 기능 이외에 여러 개의 편리한 기능이 추가되었다.

n  MessageSource, i18n 스타일로 메시지에 대한 접근을 제공

n  자원에 대한 접근, URL이나 파일과 같은 형태

n  ApplicationListener 인터페이스를 구현하는 bean을 위한 이벤트 처리(propagation)

n  리소스로의 액세스 수단 간편화

n  다중(구조적) 컨텍스트이 로딩(애플리케이션의 웹 레이어처럼, 각각을 하나의 특정 레이어에 집중 될수 있도록 허용)

-       대표적인 구현 클래스

n  ClassPathXmlApplicationContext

 

ApplicationContext를 사용하여 객체 가져오기

ApplicationContext factory =

        new ClassPathXmlApplicationContext("applicationContext.xml");

 

GreetingService bean = (GreetingService) factory.getBean("greeting");

 

'개발자 센터 > Spring' 카테고리의 다른 글

Spring에서 iBatis 연동하기  (7) 2009.12.13
AOP : Aspect Oriented Programming  (0) 2009.12.13
빈 라이프 사이클  (0) 2009.12.13
Spring Framework의 개요  (0) 2009.12.13
Spring Framework 특징  (0) 2009.12.12
Posted by 피곤키오
,