본문 바로가기

WEB의 속삭임/Server단의 외침

[Spring][기초]DI패턴

* 객체 의존성 표현 

1. 클래스에 실제로 의존 객체를 지정 하는 방법.

2. 의존성을 주입 하는 법(DI) : 조립기, 팩토리에서 조회 하는 다양한 방법으로 주입하는 방법 

* DI 패턴 : 해당 용어는 다른 언어에서는 또 다르게 사용 될수는 있다. 하지만 의존성을 주입하는 방법은 달라도 주입한다는 것은 같다.

 

* 왜하니? :  특정 단위로 테스트 하기위해 흔히 쓴다. 예를들어 객체가 서로 의존하면은 특정 객체를 테스트 하기위해서는 의존된 객체가 모두 준비 되어 있어야 된다. 하지만 의존성을 주입 형태로 변경하게 되면, 더미객체(몽크객체)를 주입하여 테스트를 하겠다는 것이다. 사실 자바를 예를 들면 자바만 사용하여 어플를 만든다면 의미 있다. 하지만 웹에서는 그다지..필요가 없다..난 왜 사람들이 스프링 스피링 그러는지 몰겠다...사실 여기저기 플젝을 하다보면 새로운 기술을 잘몰라서 또는 새로운 기술만 배워서 하는 실수가 참 많은데..스프링처럼 모든 상황에 다 적용할려고 크게 만든 프레임워크를 쓰는건 그다지 바람직하지 못한거 같기도 하다...아 주절주절 말이 많았다.



* applicationContext.xml : Spring 객체를 bean으로 만들어 관리 한다. 

    <bean name="writeArticleService" /** 빈의 이름 **/

        class="XXXX.XXXXX.XXXXX.WriteArticleServiceImpl"> /** Bean이 될 클래스 **/

        <constructor-arg> /** 해당 객체가 생성 될시 생성자에게 넘겨줄 인자 값들 **/

            <ref bean="articleDao"></ref> /** 인자 값으로 줄 bean 명 **/

        </constructor-arg>

    </bean>

    

    <bean name="articleDao" /**  bean 명**/ 

        class="XXXX.XXXXX.XXXXX.MySQLArticleDao">/** bean이 될 클래스 **/</bean>


* 위에서 처럼 하면, WriteArticleServiceImpl을 생성할때 articleDao bean을 생성자에 주입하게 된다.

* 그렇다면, WriteArticleServiceImpl는 어떻게 호출할까? 아래 처럼 하면 된다.

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

BeanFactory beanFactory = new XmlBeanFactory(resource);

WriteArticleService articleService =  beanFactory.getBean("writeArticleService",WriteArticleService.class);

articleService.write(new Article());





* bean 생성

<bean name="articleDao" class="xxx.xxx.xxxx.xxxxx.MyclassDao"></bean>


* 싱글톤 bean 생성 

<bean name="articleDao" class="xxx.xxx.xxxx.xxxxx.MyclassDao" factory-method="getInstance"></bean>


* 생성자 아규먼트 설정.

<bean name="MyService" class="xxx.xxx.xxxx.xxxxx.MyclassService" >

<constructor-arg>

<ref bean="MyDao" />

</constructor-arg>


<constructor-arg ref="MyDao"/>


<constructor-arg>

<value>10</value>

</constructor-arg>


<constructor-arg value="10"/>


<constructor-arg ref="stringArg"/>


<constructor-arg>

<value>stringArg</value>

</constructor-arg>


<constructor-arg>

<value type="long">3000</value>

</constructor-arg>

</bean>


<bean name="MyDao" class="xxx.xxx.xxxx.xxxxx.MyclassDao" ></bean>





* 프로퍼티 설정 방식


* java 

public class ClassName{


private TestClass testClass;


public void setTestClass( TestClass testClass){

this.testClass = testClass;

}


}


* xml설정 

<bean name="[bean 식별자 id]" class="[bean으로 사용될 클래스 / 여기선 ClassName 클래스가 됨.]">

<property name="[setter method명을 적는데 앞에 set을 제외하고 첫자를 소문자로 한다./ 여기선 testClass 이다.]">

<ref bean="[setter로 넘겨질 bean의 식별자 id]"

</property>

</bean>


<bean name="[bean 식별자 id]" class="[bean으로 사용될 클래스]"/>


<beans 

... 

xmlns:p="http://www.springframework.org/schema/p"

...>


<bean id="[bean 식별자 id]" class="[bean으로 사용될 class]"

p:[propertyName]="value"

p:[propertyName]-ref="[bean id]"

/>

</beans>





* 룩업 메소드 설정 


* xml 설정

<bean id="[bean의 식별자]" class="[설정될 클래스]">

<lookup-method name="[lookup-method Name]" bean="[리턴해줄 클래스의 bean name]" />

</bean>

<bean id="[bean의 식별자]" class="[bean으로 사용될 클래스]" />


* java 소스

public class ClassName{


public void methodName(){

...

lookupMethodCall();

...

}


protected Object lookupMethodCall(){

return null;

}


}





* 위에서는 전부 bean 식별자 id를 만들어 다른 bean에게 주도록 전달했다. 식별자 id없이 bean을 중첩 사용해보겠다.


* xml 설정

<bean id="[bean 식별자 id]" class="[bean으로 사용될 클래스]">

<property name="[property name]">

     <bean class=" ... ">

<contructor-arg value="true"/>

</bean>

</property>

</bean>