본문 바로가기

Java/Spring

Spring 3.0 프로그래밍 챕터2

 

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"
 xmlns:context="
http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 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-3.0.xsd
       
http://www.springframework.org/schema/context
      
http://www.springframework.org/schema/context/spring-context-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