02-01. 스프링 컨테이너
스프링은 객체를 관리하는 컨테이너를 제공한다. 컨테이너에 객체를 담아두고, 필요할 때에 컨테이너로부터 객체를 가져와 사용할 수 있도록 하고 있다. BeanFactory와 ApplicationContext가 컨테이너 역할을 수행하는 인터페이스가 된다.
2.1 스프링 컨테이너의 주요 인터페이스
1.1 BeanFactory 인터페이스
org.springframework.beans.factory.BeanFactory 인터페이스는 Bean 객체를 관리하고 각 Bean 객체간의 의존 관계를 설정해 주는 기능을 제공하는 가장 단순한 컨테이너로서, 구현 클래스로 org.springframework.beans.factory.xml.XmlBeanFactory 클래스가 존재한다.
XmlBeanFactory 클래스는 외부 자원으로부터 설정 정보를 읽어 와 Bean 객체를 생성한다. 그리고 org.springframework.core.io.Resouce 인터페이스를 사용하여 다양한 종류의 자원을 동일한 방시으로 표현할 수 있도록 하고 있다.
클래스 |
설
명 |
org.springframework.core.io. FileSystemResouce |
파일 시스템의 특정 파일로부터 정보를 읽어 온다. |
org.springframework.core.io. InputStreamResouce |
InputStream으로부터 정보를 읽어온다. |
org.springframework.core.io. ClassPathResouce |
Class Path에 있는 자원으로부터 정보를 읽어 온다. |
org.springframework.core.io. UrlResouce |
특정 URL로부터 정보를 읽어 온다. |
org.springframework.web.context. support.servletContextResource |
웹 어플리케이션의 루트 디렉토리를 기준으로 지정한 경로에 위치한 자원으로부터 정보를 읽어 온다. |
1.2 ApplicationContext 인터페이스와 WebApplicationContext 인터페이스
Org.springframework.context.ApplicationContext인터페이스는 BeanFactory 인터페이스를 상속받은 하위 인터페이스로서 BeanFactory가 제공하는 Bean관리 기능 이외에 Bean 객체 라이프 사이클, 파일과 같은 자원 처리 추상화, 메시지 지원 및 국제화 지원, 이벤트 지원, XML스키마 확장을 통한 편리한 설정 등 추가적인 기능을 제공하고 있다. 따라서, 스프링을 이용하여 어플리케이션을 개발할 때에는 단순히 빈 객체 생성 기능만을 제공하는 BeanFactory보다 ApplicationContext 인터페이스의 구현 클래스를 주로 사용하게 된다.
Org.springframework.context.WebApplicationContext 인터페이스는 웹 어플리케이션을 위한 ApplicationContext로서 하나의 웹 어플리케이션(하나의 ServletContext)마다 한 개 이상의 WebApplicationContext를 가질 수 있다.
02. Bean 생성과 의존 관계 설정
2.1 Bean 객체 설정 및 컨테이너를 통한 Bean 객체 사용.
<bean id=”articleDao” class=”madvirus.spring.chap02.MySQLArticleDao”>
class속성: 생성할 bean 객체의 완전한 클래스 이름을 입력한다.
id속성: 컨테이너에서 생성된 객체를 구분하는 데 사용되는 식별 값.
id속성 대신에 name 속성을 사용해도 된다.
2.2 의존 관계 설정
스프링 컨테이너에서 각 객체의 의존 관계도 XML 파일을 통해 명시할 수 있다.
의존관계 설정 방식 |
태그 |
설 명 |
생성자 방식 |
<constructor-arg> |
생성자를 통해 의존하는 객채를 전달받을 경우에 사용함. |
프로퍼티 설정 방식 |
<property name=”setter이름>” |
setXXX()형태의 메서드를 사용해서 필요한 객체와 값을 전달 받는다. |
XML 네임스페이스를 이용한 프로퍼티 설정 |
<bean id=”xx” class=”xx” p:periodTime:”10” p:sender-ref=”객체이름”/> |
Property 태그를 사용하지않고 좀더 간단하게 설정하는 방식. Ref로 끝나는 객체는 사용할 수 없다. |
룩업 메서드 인잭션 방식 |
<lookup-method Name=”메서드명” Bean=”식별값 />” |
상속을 이용해서 오버라이딩하여 사용한다. |
임의 빈 객체 전달 |
<constructor-arg> <bean … </constructor-arg> 또는 <property> <bean … </property> |
constructor-arg 태그나 property태그 안에 bean 객체를 직접 넣는다. 식별값을 갖지 않기 때문에 재사용할 수 없다. 식별값을 준다 하여도 사용할 수 없다. |
태그에 값을 전달할 경우 객체는 ref 태그를 사용한다.
예) <ref bean=”articleDao”/>
기본 데이터 타입나 String인 경우에는 value 태그를 사용한다.
<value>10<value>
Value 태그는 타입을 지정하지 않으면 기본적으로 String으로 식별한다. 그러므로 다른 타입인 경우에는 type을 지정해줘야 한다. Long의 경우 아래처럼 사용한다.
<value type=”long”>10<value>
2.3 컬렉션 타입을 입력 받기 위한 스프링 태그
태 그 |
컬렉션 타입 |
설 명 |
<list> |
java.util.List |
List타입이나 배열에 값 목록을 전달할 때 사용된다. |
<map> |
java.util.Map |
Map 타입에<키,값>목록을 전달할 때 사용된다. |
<set> |
java.util.Set |
Set 타입에 값 목록을 전달할 때 사용된다. |
<properties> |
java.util.Properties |
Properties 타입에 <프로퍼티이름, 프로퍼티값> 목록을 전달할 때 사용된다. |
List, map 및 set 태그는 value 태그뿐만 아니라 다양한 값을 표현할 수도 있다.
<ref> : 다른 스프링 빈 객체를 값으로 사용
<bean> : 임의 빈 객체를 생성해서 값으로 사용
<value> : 레퍼 타입이나 String을 값으로 사용
<list>,<map>,<props>,<set> : 콜렉션 객체를 값으로 사용
<null> : null 레퍼런스를 값으로 사용
2.4 의존 관계 자동 설정
byname : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정한다.
byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정한다.
constructor : 생성자 파라미터 타입과 같은 타입을 갑는 bean객체를 생성자에 전달한다.
autodetect : constructor방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정한다.
3 Bean 객체의 범위
범 위 |
설 명 |
singeton |
스프링 컨테이너에 한 개의 빈 객체만 존제한다.(기본값) |
prototype |
빈을 사용할 때 마다 객채를 생성한다. |
request |
HTTP 요청마다 빈 객체를 생성한다.WebApplicationContext에서만 적용 가능하다. |
session |
HTTP 세션마다 빈 객체를 생성한다.WebApplicationContext에서만 적용 가능하다. |
global-session |
글로벌 HTTP 세션에 대해 빈 객체를 생성한다. 포틀릿을 지원하는 컨텍스트에 대해서만 적용 가능하다. |
4 라이프 사이클
4.1
bean객체의
라이프 사이클
①빈 객체 생성
②BeanNameAware.setBeanName() - 빈 이름 설정
③BeanFactoryAware.setBeanFactory() - 빈 팩토리 설정
④BeanPostProcessor의 초기화 전처리 - 초기화 전에 빈에
대한 처리
⑤InitializingBean.afterPropertiesSet() - property설정(setter설정) 완료후 실행
⑥커스텀 init-method - 초기화 메서드
⑦BeanPostProcessor의 초기화 후처리 - 초기화 후에 빈에
대한 처리
⑧빈 객체 사용
⑨DisposableBean.destory() - 객체가 소멸되기 전에 수행
⑩커스텀 destory-method - 객체가 소멸되기 전에 사용자가 정의한 것
수행
5
외부설정 프로퍼티
PropertyPlaceholderConfigurer 클래스를 빈으로 등록하면 외부의 프로퍼티 파일에 저장된 정보를 스프링 설정 파일에서 사용할 수있다. 다음과 같은 프로퍼티 파일이 있다고 하자.
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/office jdbc.username=springbook jdbc.password=springbook |
위 프로퍼티 파일의 정보를 스프링 설정파일에서 사용하고 싶다면, 다음과 같이 PropertyPlaceholderConfigurer 클래스를 빈으로 등록한
뒤, 프로퍼티 이름을 설정 파일에서 사용하면 된다.
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations">
<value>classpath:config/jdbc.propertyes</value> </property> </bean> <bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"> <property
name="driverClassName" vlaue="${jdbc.driver}"/> <property name="url"
vlaue="${jdbc.url}"/> <property name="username"
vlaue="${jdbc.username}"/> <property name="password"
vlaue="${jdbc.password}"/> </bean> |
외부
환경에 따라 설정 벙보가 변경되는 경우에 프로퍼티 파일을 유용하게 사용할 수 있다. 예를 들어,로컬에서의 테스트와 테스트 서버에서의 통합 테스트, 그리고 실제 운영
환경에서 사용하는 데이터베이스가 다르다고 하자. 이경우 각 환경에 맞게 스프링 설정 파일을 변경하는
것보다는 환경에 맞는 프로퍼티 설정 파일을 작성하고, 환경에 따라 알맞은 프로퍼티 파일을 사용하도록
배치 스크립트를 삭성하는 것이 유지 및 보수에 더 편리하다.
<context:property-placeholder>태그를 사용하여 외부 프로퍼티 파일을 로딩하도록 설정할 수도 있다.
<beans xmlns="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
<context:property-placeholder
location="classpath:config/jdbc.properties"/> <bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"> <property
name="driverClassName" vlaue=${jdbc.driver}"/> <property name="url"
vlaue=${jdbc.url}"/> <property name="username"
vlaue=${jdbc.username}"/> <property name="password"
vlaue=${jdbc.password}"/> </bean> |
context:property-placeholder>태그를 사용하려면 위 코드와 같이 context 접두어 에 대한 네임스페이스
를http://www.springframework.org/schema/context 로지정하고 네임스페이스와 관련된 XML 스키마 경로를 spring-context-3.0.xsd로 지정해 주어야 한다.
여러
개의 프로퍼티 파일을 사용하려면 각 프로퍼티 파일을 콤마로 구분하여 지정하면 된다.
<context:property-placeholder location="classpath:config/jdbc.properties,classpath:config/monitor.properties"/> |
'Java > Spring' 카테고리의 다른 글
form으로 파일 전송 (0) | 2012.06.28 |
---|---|
spring + freemarker (0) | 2012.06.22 |
Spring 3.0 프로그래밍 챕터3 (0) | 2011.05.31 |
Spring 3.0 프로그래밍 챕터1 (0) | 2011.05.23 |
XML을 출력하자 (0) | 2011.05.20 |