[Spring Legacy] XML Config 로 AOP 적용하는 방식

식빵·2023년 4월 27일
0

spring-legacy-configure

목록 보기
2/9
post-thumbnail

참고:
제목에서 표현한 Spring LegacySpring Boot 를 사용하지 않는 환경을 의미합니다.
참고로 (당연히) Spring Legacy 도 Java Config 가 가능합니다.
다만 제가 일하는 곳에서는 일반적으로 Spring Legacy 환경 + XML 설정 을 하다보니
글을 이렇게 작성하게 되었습니다.


XML AOP 설정

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>

Advice 로 사용될 Class 작성

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(); // 메소드 시그니쳐
		
        // 필요한 처리를 하세요...
    }
}



Transaction XML AOP 설정

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: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 으로 넘길 수 있다.



참고 링크

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글