Study/Spring Framework
[Spring] AOP(Aspect Oriented Programming)
'지훈'
2021. 4. 29. 14:53
AOP 개요
AOP란 관점 지향 프로그래밍이란 뜻이다. 핵심 기능에서 부가 기능을 분리하여 각 기능을 모듈화하고 핵심 기능을 설계하고 구현할 때 객체 지향적인 가치를 지킬 수 있도록 도와주는 개념이다.
은행 서비스를 예를 들때 Banking, Account, Customer 서비스를 핵심 기능으로 두고 Security, Transaction 등을 부가 기능으로서 모듈화 하여 각 핵심 기능을 설계하고 구현할 때 사용하는 것이다.
AOP 핵심 용어
- Target : 핵심기능을 담고 있는 모듈로, 부가기능을 부여할 대상이 된다.
- Advice : 어느 시점에 어떤 부가기능을 적용할지 정의한 것이다. 부가기능을 담고 있는 모듈이다.
- Joinpoint : Aspect가 적용될 수 있는 지점이다.(method, field). Spring에서는 method Joinpoint만 제공한다.
- Pointcut : 부가 기능이 적용되는 Joinpoint이다.
- Aspect : Advice + Pointcut. AOP의 기본 모듈이다.
- Weaving : Pointcut에 의해 결정된 타겟의 Joinpoint에 Advice를 삽입하는 과정이다.
프록시(Proxy)
Spring은 Target 객체에 대한 프록시를 만들어 제공한다.
프록시는 호출을 가로채서 Advice를 수행하고 핵심기능을 수행하거나(전처리 Advice) 핵심기능을 수행하고 Advice를 수행하는(후처리 Advice) 등의 일을 한다.
이러한 시점은 Annotation으로 정의할 수 있다.
- @After : method가 정상적으로 실행되거나 예외가 발생하거나 상관없이 마지막에 실행된다.
- @Before : method 실행 전에 실행된다.
- @AfterReturning : method가 정상 실행됐을 때 실행된다.
- @AfterThrowing : method에서 예외 발생 후에 실행된다.
- @Around : method의 실행 전과 후에 실행된다. 예를 들어 method의 실행시간을 측정하는 기능에 사용된다.
@Aspect
public class LoggingAspect {
private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Before(value = "execution(* com.test.guestbook.model..*.*(..))")
public void loggin(JoinPoint jp) {
logger.debug("메서드 선언부 : {} 전달 파라미터 : {}", jp.getSignature(), Arrays.toString(jp.getArgs()));
}
}
@Aspect는 해당 클래스가 Aspect라는 것을 명시해주는 것이다.
Annotation을 사용 시 root-context.xml 설정 파일에
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
위와 같은 프록시를 반드시 설정해줘야 한다.
AspectJ 표현식
Advice를 적용하려는 method들의 패턴은 excution으로 표현한다.
excution(접근제한자? 리턴타입? 이름패턴(파라메터패턴)) 식으로 표현하는데 ?로 표시된 부분은 생략 가능하다.
*은 한개의 모든 값을 표현하고 ..은 0개 이상의 모든 값을 표현한다.