본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Spring] Spring framework 개요 #4

by 돼지왕 왕돼지 2013. 7. 3.
반응형


 Spring framework 개요 #4

 

[Spring] Spring framework 개요 #4


의존관계 주입 ( DI, Dependency Injection )


* Dependency Injection 의 약자로 IoC로 명확한 의미가 전달되지 않아 만들어진 용어이다.


* 의존관계( Dependency relationship)은 UML 에서 ---> 로 나타낸다.

A ---> B 는 B가 변하면 A 에 영향을 미친다는 의미.

대표적인 경우가 A가 B를 사용할 경우이다.


* Dependent Object

Runtime 시 의존관계를 맺는 대상 혹은 실제 사용대상인 object.


* 의존관계 주입은 다음 세 가지 조건을 충족한다.

1. 클래스 모델이나 코드에는 runtime 시점의 의존관계가 드러나지 않는다. 

   즉 interface 에만 의존한다.


2. 런타임 시점의 의존관계는 container 나 factory 같은 제 3의 존재가 결정한다.


3. 의존관계는 사용한 object 에 대한 reference 를 외부에서 제공(주입) 해줌으로서 만들어진다.




Dependency Lookup ( 의존관계 검색 ).


자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는다. ( 주입이 아님 )

의존관계 주입과 같은 효과이나, POJO 에 Spring API 가 주입되어 코드가 더러워보인다.

하지만 dependency lookup 을 반드시 사용할 때가 있는데, main() 역할을 하는 곳에서 사용된다. 

다시 말해 처음 출발시점에는 injection 이 아닌 lookup 이 한번은 사용되어야 한다.


dependency lookup을 사용하는 object는 spring bean일 필요가 없다.

하지만 dependency injection 에서는 주입받는 녀석이 bean object 여야만 한다.




의존관계 주입의 응용


메소드를 이용한 의존관계 주입

생성자를 통하지 않는 방법이 일반적이다.

1. 수정자(setter) 메소드를 이용한 주입 - 전통적으로 가장 많이 쓰이며, XML 과 호환된다.

2. 일반 메소드를 이용한 주입.







XML 을 이용한 설정


XML 을 사용하면 compile 등의 추가 build 작업 없이 변경사항을 빠르게 반영할 수 있다.

정해진 format 을 따랐는지도 손쉽게 확인 가능하다.


<beans> 태그가 root 로 @configuration 으로 지정한 factory class 를 대체한다.

<bean> 태그는 @bean 으로 지정한 object return method 를 대체한다.

Bean의 이름은 id attribute 로 매핑

Bean의 return되는 클래스는 class attribute 로 매핑

<property> 태그는 property setter 역할을 한다. ( bean 태그의 DI object 로 보면 된다. )

variable name 에 해당하는 녀석은 name attribute 로 매핑

주입되는 bean 의 이름은 ref attribute 로 매핑, 이 값은 bean 태그로 미리 정의되어야 하며, bean 태그의 id 와 같아야 한다.




DTD 와 Schema


XML 문서 구조정의는 DTD와 Schema 가 있고, 정해진 구조의 syntax check 가 가능하다.

DTD의 경우 아래와 같이 정의하고

<!DOCTYZPE beans ...> 

스키마의 경우 특별목적을 위한 별도태그 사용이 가능하며, 아래와 같이 정의한다.

<beans xmlns="http://...." ... >




XML 을 이용한 경우의 Application Context


GenericXmlApplicationContext 는 생성자 parameter 로 XML 파일 class path 를 지정해준다.

관례에따라 설정파일 이름은 applicationContext.xml 을 주로 사용한다.


ClassPathXmlApplicationContext를 이용하면 XML 패스지정을 생략하며 설정파일을 가져올 수 있다.


아래의 두 코드는 같은 역할을 한다.

new GenericXmlApplicationContext("spring/user/dao/daoContext.xml")

new ClassPathXmlApplicationContext( "daoContext.xml", UserDao.class )



보통은 GenericXmlApplicationContext 를 사용한다.







Property 값의 주입


Bean object 뿐만아니라, int, string, 일반 object 등도 주입할 수 있다.

이 때 value 값은 string 으로 전달되지만, setter 함수의 parameter type을 보고 spring이 자동으로 casting 해주니 걱정 No.



반응형

댓글