7.1. 스프링의 기술과 API를 효과적으로 학습하는 방법#

스프링의 모든 코드와 API가 DI라눈 원리를 기반을 두고 만들어졌다.

7.1.1 빈으로 등록되는 스프링 클래스와 DI#

어떤 오브젝트가 빈으로 사용된다는 데는 두가지 의미

  • 다른 빈에 의해 DI돼서 사용되는 서비스라는 의미이다.
  • 다른 빈이나 정보에 의존하고 있다는 의미이다.
<bean id=“transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="datSource" />
</bean>
<bean id="dataSource" class=" ... "> ... </bean>

구현 인터페이스 분석#

프로퍼티 분석#

DI/확장 포인트 분석#

DelegatingDataSource를 기반으로 하는 다양한 데코레이터 또는 프록시를 제공한다. 대표적인 것은?

  • LazyConnectionDataSourceProxy : 트랜잭션 매니저와 실제 DataSource사이에서 DB커넥션 생성을 최대한 지연시켜주는 기능을 제공
<bean id="dataSource" class="...LazyConnectionDataSourceProxy">
	<property name="targetDataSource" ref="realDataSource" />
</bean>
<bean id=“ realDataSource“ class="..."> .. . </bean>
  • AbstractRoutingDataSource : 다중 DataSource에 대한 라우팅을 제공하는 프록시이다.
public class ReadOnlyRoutingData5ource extends AbstractRoutingDataSource {
	protected object determineCurrentLookupKey() {
		boolean readOnly =
			TransactionSynchronizationManager.isCurrentTransactionReadOnly();
		return readOnly ? "READAONLY" "READWRITE";
	}
}

<bean id="dataSourceRouter“ class=" . .. ReadOnlyRoutingDataSource ">
	<property name="targetDataSources">
		<map>
			<entry key="READWRITE" value-ref="masterDataSource" />
			<entry key="READONLY" value-ref="readOnlyDataSource"/>
		</map>
	</property>
	<property name="defaul tTargetDataSource" ref=“masterDataSource"/>
</bean>
<bean id="masterDataSource" class="...">...</bean>
<bean id="readOnlyDataSource" class="...">...</bean>

7.2 IoC컨테이너와 DI#

7.2.1. BeanPostProcessor와 BeanFactoryPostProcessor#

IoC컨테이너의 확장 포인트 중 가장 많이 사용하는 것은 빈 후처리기와 빈 팩토리 후 처리기이다.

BeanPostProcessor#

public interface BeanPostProcessor (
	Object postProcessBeforelnitialization(Object bean, String beanName) throws BeansExcept ion;
	Object postProcessAfterlnitialization(Object bean, String beanName) throws BeansException;
}
  • postProcessBeforelnitialization() 메소드는 빈 오브젝트가 처음 만들어지고 아직 초기화 메소드가 호출되기 이전에 실행
  • @Autowired나 @Inject 같은 애노테이션을 이용해서 정의된 빈 의존관계를 적용하는 것도 BeanPostProcessor를 구현한 빈이 해주는 작업이다.

BeanFactoryPostProcessor#

public interface BeanFactoryPostProcessor {
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
  • 컨테이너는 빈 팩토리 후처리기가 있으면 postProcessBeanFactory() 에 빈의 모든 메타정보를 담고 있는 ConfigurableListableBeanFactory타입의 오브젝트를 전달해주는데 바로 컨테이너 자신을 보내주는 것이다.

7.3. SpEL#

  • 스프링이 직접 제공하는 표현언어인 스프링 EL을 SpEL이라고 한다.
  • SpEL은 다양한 용도로 활용한다.
    • 빈 설정파일이나 애노테이션을 이용해 프로퍼티 값을 지정할때 사용한다.
    • JSP의 <spring:eval> 태그를 통해 사용한다.
@SecuredLogic ("user.level == T( com ... UserLevel).GOLD")
public void goldUserOnly() { ... }
@SecuredLogic( "user.point > 100 && user.retryCount < 5")
public void transferPoint() { ... }

7.3.1. SpEL 사용방법#

  • SpEL을 코드에서 사용하려면 두가지 인터페이스를 활용해야 한다.
    • ExpressionParser
ExpressionParser parser = new SpelExpressionParser();
    • Expression
Expression ex = parser.parseExpression("1+2");
int result = (Integer)ex.getValue();

7.4. OXM#

  • 스프링에서 OXM추상화를 적용하는 두가지 방법
    • 코드에서 직접 마샬러 빈을 가져와 Marshaller인터페이스를 이용해서 XML과 오브젝트 사이의 변경작업을 수행
    • 웹환경에서 XML뷰나 XML메시지 컨버터를 만들때 활용

7.4.1. Marshaller /Unmarshaller 인터페이스#

public interface Marshaller (
	boolean supports(Class(?) clazz);
	void marshal(Obiect graph , Result result) throws IOException, XmlMappingException;
}
public interface Unmarshaller (
	boolean supports(Class<?> clazz);
	Object unmarshal(Source source) throws IOException, XmlMappingException;
}

7.4.2. OXM 기술 어댑터 클래스#

  • 기본으로 지원하는 OXM기술은 5가지이다.
    1. Castor
    2. JAXB
    3. XMLBeans
    4. JiBX
    5. XStream
  • 하나의 어댑터 클래스가 마샬러와 언마살러를 모두 구현하고 있다.
<bean id="castorMarshaller"’ class="org.springframework.oxm.castor.CastorMarshaller" />

<bean id="myService" class="...">
	<property name="marshaller" ref="castorMarshaller" />
	<property name="unmarshaller" ref="castorMarshaller" />
</bean>

<oxm:jaxb2-marshaller id="marshaller" contextPath="com.epril.myproject.xml.user.schema" />

7.5. 라모팅과 웹 서비스, EJB#

  • 스프링이 지원하는 리모팅 기술
    1. RMI
    2. 스프링 HTTP Invoker
    3. Hessian
    4. Burlap
    5. JAX- RPC
    6. JAX-WS
    7. JMS
    8. RESTful

7.5.1. 익스포터와 프록시#

익스포터 #

  • 서비스를 제공할때 원격 요청을 받아서 특정 인터페이스를 구현한 서비스 빈에게 요청을 전달해주는 빈을 이용하는데 이를 익스포터라고 한다.
  • 보통 익스포터는 원격 요청을 처리하는 서블릿 등을 통해 HTTP요청을 전달받고 이를 해석한 후에 미리 설정을 통해서 등록된 인터페이스를 이용해 서비스빈을 호출한다.
<bean name=" /remoting/userservice" class="org.springframework.remoting.httpinvoker.HttplnvokerServiceExporter">
	<property name="servlce “ ref="userService"/>
	<property name="servicelnterface" value="com.epril.myproject.service.UserService"/>
</bean>

프록시#

  • 원격 시스템에 있는 오브젝트를 대신해서 클라이언트 오브젝트의 호출을 받고 이를 원격 오브젝트에 전송해서 결과를 가져와 클라이언트 오브젝트에게 돌려주는 역할을 맞은 빈 오브젝르를 프록시라고 부른다.
<bean id="memberWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
	<property name="servicelnterface" value="com.epril.myproject.service.MemberService"/>
	<property name="wsdlDocumentUrl" value="http://ws.remotecompanY.com/MemberServiceEndPoint7WSDL" />
	<property name="namespaceUri" value="http://remote/" />
	<property name="serviceName" value="MemberService"/>
	<property name="portName" value="MemberServiceServiceEndpointPort"/>
</bean>
<bean id="myBean " class="...">
	<property name="memberService" ref="memberWebService" />
</bean>

7.5.2. RESTful 서비스 템플릿#

  • RESTful 클라이언트는 HTTP 메소드 GET, POST, PUST, DELETE, HEAD, OPTIONS를 모두 지원한다.
  • 결과는 문자열로 그대로 받을 수도 있고, 메시지 컨버터를 이용해 오브젝트로 변환할수도있다.

7.5.3. EJB 서비스 이용#

7.6. 태스크 실행과 스케줄링#

7.6.1. TaskExecutor 서비스 추상화#

  • 독립적인 스레드 안에서 동작하도록 만들어진 오브젝트를 독립적으로 실행가능한 작업이라는 의미로 태스크라고 부른다.
  • 스프링은 이런 태스크를 다양한 방법으로 실행하도록 만들어진 오브젝트 특징을 추상화한 태스크 실행기(TaskExecutor) 인터페이스를 제공한다.
public interface TaskExecutor extends Executor {
	void execute(Runnable task);
}
  • 스프링이 제공하는 주요한 TaskExecutor 구현 기술과 클래스
    • ThreadPoolExecutor
    • SimpleThreadPoolTaskExecutor
    • WorkManagerTaskExecutor

7.6.2. TaskScheduler#

@Autowired TaskScheduler scheduler;
@Resource Runnable specialTask;

public void startSpecialTaskScheduler() {
	scheduler.schedule(task, new CronTrigger("0 30 4 * * MON-FRI"));
}
  • TaskSchedule의 주요 구현 클래스와 사용 기술
    • ThreadPoolTaskScheduler
    • TimerManagerTaskScheduler

7.6.3. task 네임스페이스#

<task:executor>#

<task:executor id="myExecutor" pool-size="5-10" queue-size="30" />

<task:scheduler>#

<task:scheduler id="myScheduler" />

<task:scheduled-tasks> 와 <task:scheduled>#

<task :scheduled-tasks schedu ler="myScheduler">
	<task:scheduled ref="systemAdminService" method="checkSystem" fixed-rate="5000 "/>
	<task:scheduled ref="resourceService" method="clearAll" cron="0 30 6 * * * "/>
</task:scheduled-tasks)

7.6.4. 애노테이션을 이용한 스케줄링과 비동기 태스크 실행#

@Scheduled#

  • @Scheduled는 세가지 종류의 트리거 설정을 지원한다.
    • fixedDelay
    • fixedRate
    • cron

@Async#

7.7 캐시 추상화(스프링 3.1)#

7.7.1. 애노테이션을 이용한 캐시 속성 부여#

@Cacheable#

@CacheEvict 와 @CachePut#

애노테이션을 이용한 캐시 기능 설정#

<cache:annotation-driven />

7.7.2. 캐시 매니저#

  • ConcurrentMapCacheManager
  • SimpleCacheManager
  • EhCacheCacheManager
  • CompositeCacheManager, NoOpCacheManager

7.8. @Enable 애노테이션을 이용한 빈 설정정보 모듈화#

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-2) was last changed on 08-Apr-2015 12:45 by DongGukLee