참고:
제목에서 표현한Spring Legacy
는Spring Boot
를 사용하지 않는 환경을 의미합니다.
참고로 (당연히) Spring Legacy 도 Java Config 가 가능합니다.
다만 제가 일하는 곳에서는 일반적으로Spring Legacy 환경
+XML 설정
을 하다보니
글을 이렇게 작성하게 되었습니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="me.dailycode">
</context:component-scan>
<!-- 방법 2 : @Aspect 을 이용한 spring aop 기능 사용 -->
<!-- @Aspect 를 붙인 Class 는 반드시 Bean 객체여야 한다! -->
<aop:aspectj-autoproxy/>
<!-- 방법 1 : 조금 더 수동적인 방식으로 spring aop 기능 사용 -->
<aop:config>
<!-- 타겟 지정하고 -->
<aop:pointcut id="errorHandlingPointCut"
expression="execution(* me.dailycode..impl.*Impl.*(..))
or execution(* me.toastcode..impl.*Impl.*(..))
and @annotation(me.dailycode.exception.NoCheck)"
/>
<!-- 타겟에 적용할 -->
<aop:aspect ref="exceptionHandler">
<aop:after-throwing
throwing="exception"
pointcut-ref="errorHandlingPointCut"
method="handle" />
</aop:aspect>
</aop:config>
<!-- aop:config 에서 사용될 Advice 전용 빈 생성 -->
<bean id="exceptionHandler" class="me.dailycode.exception.ExceptionHandler">
</bean>
</beans>
package me.dailycode.exception;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
// 나머지 import 생략...
public class ExceptionHandler {
// <aop:after-throwing> 태그 속성으로 지정한 method="handle" 과 같은 명칭의
// 메소드를 호출하게 된다. throwing="exception" 과 메소드의 파라미터 명이 같아야 한다!
public void transfer(JoinPoint joinPoint, Exception exception) throws Exception {
Class<?> clazz = joinPoint.getTarget().getClass(); // 클래스 정보
Signature signature = joinPoint.getSignature(); // 메소드 시그니쳐
// 필요한 처리를 하세요...
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 부수적으로 필요한 빈등록 [START] -->
<bean id="propertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/egovframework/egovProps/${spring.profiles.active}.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${my.db.driver.name}"/>
<property name="url" value="${my.db.url}" />
<property name="username" value="${my.db.username}"/>
<property name="password" value="${my.db.password}"/>
</bean>
<!-- 부수적으로 필요한 빈등록 [END] -->
<!-- Tx Aop 적용 방법 (1) -->
<!-- 수동적인 tx aop 적용 방식 [START] -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* me.dailycode..impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
<!-- 수동적인 tx aop 적용 방식 [END] -->
<!-- Tx Aop 적용 방법 (2) -->
<!-- @Transactional Annotation 방식은 아래처럼만 하면 끝이다. -->
<!-- aop:config 보다는 좀 더 자동화된 방식 -->
<tx:annotation-driven>
</beans>
참고: spring.profiles.active 파라미터는 아래처럼 VM Option 으로 넘길 수 있다.