재미있게 코딩합시다

1.Spring(스프링) -의존성 주입(Dependency Injection, DI) 본문

IT /Spring(스프링)

1.Spring(스프링) -의존성 주입(Dependency Injection, DI)

감민셔 2019. 1. 2. 17:31

의존성 주입 (Dependency Injection, DI)

 객체간의 의존 관계를 객체 자신이 아닌 외부의 조립기가 수행한다.

 제어의 역행(inversion of control IoC)라는 의미로 사용되었다.

 Martin Fowler, 2004 

- 제어의 어떠한 부분이 반전되는가라는 질문에 '의존 관계 주입'이라는 용어를 사용

- 복잡한 어플리케이션은 비지니스 로직을 수행하기 위해서 두개 이상의 클래스들이 서로 협업을 하면서 구성된다.

-각각의 객체는 협업하고자 하는 객체의 참조를 얻는 것에 책임성이 있다.

-이 부분은 높은 결합도(highly coupling)와 테스트하기 어려운 코드를 양산한다.

 DI를 통해 시스템에 있는 각 객체를 조정하는 외부 개체가 객체들에게 생성시에 의존관계를 주어짐.

- 즉, 의존이 객체로 주입됨.

- 객체가 협업하는 객체의 참조를 어떻게 얻어낼 것인가라는 관점에서 책임성의 역행임.

 느슨한결합(loose coupling)이 주요 강점

- 객체는 인터페이스에 의한 의존관계만을 알고 있으며, 이 의존관계는 구현 클래스에 대한 차이를 모르는채 서로 다른 구현으로 대체가 가능하다.




Spring의 DI 지원


 • Spring Container가 DI 조립기(Assembler)를 제공

 – 스프링 설정파일을 통하여 객체간의 의존관계를 설정한 다.

 – Spring Container가 제공하는 api를 이용해 객체를 사 용한다.



Spring 설정파일 


• Spring Container가 어떻게 일할 지를 설정하는 파일

 – Spring container는 설정파일에 설정된 내용을 읽어 Application에서 필요한 기능들을 제공한다. 

• XML 기반으로 작성한다.

• Root tag는 이다

• 파일명은 상관없다.



예) applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</bean>



Bean객체 주입 받기 – 설정파일 설정

• 주입 할 객체를 설정파일에 설정한다.

 –<bean>  : 스프링컨테이너가 관리할 Bean객체를 설정

 • 기본 속성

 – name : 주입 받을 곳에서 호출 할 이름 설정

 – id : 주입 받을 곳에서 호출할 이름 설정 (‘/’ 값으로 못 가짐)

 – class : 주입할 객체의 클래스

 – factory-method : 객체를 생성해 주는 factory 메소드 호출 시

 » 주로 Singleton 패턴 구현 클래스 객체 호출 시


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id = "robot" class = "di03.Robot" ></bean>


id에는 식별자

class에는 java파일의 주소를 적어주면된다.


예)

Robot robot = new Robot(); 를 bean에 설정을 한다면

<bean id = "robot"  class = "di03.Robot"></bean>

생성자의 이름이 id = " " 로 들어오고

class 의 주소 는 패키지 . java클래스 이름 이렇게 적어주면된다.



Sping Container 객체

 Spring Container : 객체를 관리하는 컨테이너

 – 다음 아래의 interface들을 구현한다


설정을 통한 객체 주입 – Constructor를 이용

 객체 또는 값을 생성자를 통해 주입 받는다.

: 하나의 argument 지정 

의 하위태그로 설정한 bean 객체 또는 값을 생성자 를 통해 주입하도록 설정

 – 설정 방법 : ,와 같은 하위태그를 이용하여 설정, 속성을 이용해 설정

 – 하위태그 이용 • <ref bean = "bean name"/>- 객체를 주입 시 

• <value>값</value> - 문자(String), Primitive data 주입 시

 – type 속성 : 값을 1차로 String으로 처리한다. 값의 타입을 명시해야 하 는 경우 사용. ex) <value type = "int">10</value> 

– 속성 이용

• ref=“bean 이름” 

• value=“값”



<bean id = "robot" class = "di03.Robot  lazy-init="true" ></bean>


lazy-init = "true"    이 들어가게 된다면.. 해당 bean 객체는 컨테이너 빌드시 생성 안하고 처음으로 getBean요청이 있

을때 생성을한다.


썻을 떄와 안썻을때의 차이점 :   안썻다 ==> 만들어놓고 요청들어올떄 주는것 

썻다 ==> getBean 요청이 들어올떄  준다



스프링 컨테이너의 기본 정책 ==> 

컨테이너가 빌드 될 때 필요한 모든 Bean객체를 생성, getBean을 계속 해도 만들어져있던 객체를 주기만 한다.

default == singleton(싱글턴)

싱글턴 => 객체를 한번만 생성후 호출될 때 만들어진 호출을 계속 재사용하는것 (계속 생성하지않는다)


but 만약 달라고 할 때마다 새거를 주기를 원한다면...??

scope = "prototype" 을 쓴다.


<bean id = "robot" class = "di03.Robot scope="prototype" ></bean>

 을 추가해주면 된다.


getBean요청마다 새거 만들어서 준다.



property  ====> setter에 값을 집어넣는다.


도 추가해주시면 됩니다.



setter가 아닌 생성자를 통해서 객체를 생성할려면>???



객체를 만들어주는 메소드를 팩토리 메소드 == Factory 메소드








Comments