티스토리 뷰

Aop 따라잡기.

AOP 개념에 대해서는 여기서 설정하지 않는다.
(웹서핑 5분만 해보면 정리 잘 되어 있는 페이지들이 아주 많이 있다.)

AOP 설정하는 방법은 여러가지가 있지만 XML에 설정하는 고전적인 방법은 설명하지 않을 예정이지만, 생각보다 여러 프로젝트에서 많이 사용되고 있으니 알아두면 손해 볼 일은 없을 것이다.
참고로 여기서는 @Aspect Annotation을 통한 AOP 설정을 소개하도록 한다.

먼저 AspectJ 관련 Annotation을 사용하기 위해서는 XML에 기본 설정이 필요하다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

     <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 이 설정을 하지 않으면 @Aspect 가 정상 동작하지 않는다. -->

</beans>

proxy-target-class="true" 
이 설정을 하지 않으면 @Autowired 사용시 Bean을 정상적으로 생성하지 못할 수 있습니다. 만약 BeanCreationException 이 발생한다면 해당 옵션을 주도록 합니다.

샘플 코드
@Component("processExecutionLogAdvice")
@Aspect
public class ProcessExecutionLogAdvice {
     private static final Log LOG = LogFactory.getLog(ProcessExecutionLogAdvice.class);
    
     @Around(value = "execution(public * execute(Object))  && args(obj)")
     public Object logAroundAdvice(ProceedingJoinPoint pjp, Object obj) throws Throwable {
          LOG.info(pjp.getTarget().getClass().getSimpleName() + " starts");
          Object returnValue = pjp.proceed();
          LOG.info(pjp.getTarget().getClass().getSimpleName() + " ends");
         
          return returnValue;
     }
}

@Component 를 사용한 이유는 Pointcut으로 사용될 객체도 Spring 내에서 bean으로 생성되어 있어야 하기 때문이다. Annotation을 사용하지 않고 XML에 bean 설정을 하여도 무방하다.
여기서는 단순히 로깅 처리를 위해 로그만 찍고 있으나, 로그 포멧의 자유자재로 수정이 가능하다.

여기서 눈 여겨 봐야 할 내용은 @Around 이다. @Around는 적용할 target이 수행되기 전 앞/뒤로 뭔가 수행하고자 할 때 사용될 수 있다.
그 외에도 @Before, @After 등이 있는데 @Before와 @After를 사용하면 @Around와 동일한 효과를 낼 수도 있다.(상식?)

또 하나 알아야 할 사항으로 value 값에 지정한 Expression이다.
예제에서는 execution(public * execute(Object))  && args(obj) 로 사용되었다. 의미는 "execute(Object obj) 인 Method에 적용하겠다"라는 의미이다. 샘플 코드로 Object가 사용되었지만 사용자가 정의한 클래스도 활용이 가능하니, 참으로 활용 영역은 넓다고 할 수 있다.

자세한 내용은 아래 참고정보를 활용하기 바란다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함