스프링 10강 - AOP란? (2/2) @Aspect로 AOP 구현
November 11, 2018
10-1 @Aspect를 이용한 AOP 구현
- 의존 설정(pom.xml)
- @Aspect 어노테이션을 이용한 Aspect클래스 제작
- @Pointcut 메서드를 만들어 사용하는 방법
- @Pointcut 메서드를 만들지 않고 바로 적용하는 방법
- XML파일에 <aop:aspectj-autoproxy /> 설정
<!-- 1. 의존 설정 pom.xml -->
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
// 2. @Aspect 어노테이션을 이용해 공통 기능 클래스 제작 LogAop.java
@Aspect
public class LogAop {
// 2.1 pointcut 메서드를 이용하는 방법
@Pointcut("within(com.javalec.ex.*)")
private void pointcutMethod(){
}
@Around("pointcutMethod()")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + "is start.");
// 핵심기능 실행전 공통기능
long st = System.currentTimeMillis();
try{
// 핵심기능
Object obj = joinpoint.proceed();
return obj;
} finally {
// 핵심기능 실행후 공통기능
long et = System.currentTimeMillis();
System.out.println(signatureStr + "is finished.");
System.out.println(signatureStr + "경과시간:" + (et - st));
}
}
// 2.2 pointcut 메서드를 이용하지 않고 바로 적용하는 방법
// 괄호 안에 메서드가 아니라 Expression 바로 입력
@Before("within(com.javalec.ex.*)")
public void beforeAdvice(){
System.out.println("beforeAdvice()");
}
}
<!-- 3. XML 설정파일에 <aop:aspectj-autoproxy /> 설정 applicationCTX.xml -->
<aop:aspectj-autoproxy />
<bean id="logAop" class="com.javalec.ex.logAop" />
<!-- <aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut id="publicM" expression="within(com.javalec.ex.*)" />
<aop:around pointcut-ref="publicM" method="loggerAop" />
</aop:aspect>
</aop:config> -->
<bean id="student" class="com.javalec.ex.Student">
<!-- 코드 생략 -->
<!-- com.javalec.ex 밑에 있는 클래스니까? 공통기능이 앞뒤로 적용되겠네? -->
<!-- + before 메서드가 핵심기능 실행전에 적용되겠네? -->
</bean>
<bean id="worker" class="com.javalec.ex.Worker">
<!-- 코드 생략 -->
<!-- com.javalec.ex 밑에 있는 클래스니까? 여기에도 공통기능이 앞뒤로 적용되겠네? -->
<!-- + before 메서드가 핵심기능 실행전에 적용되겠네? -->
</bean>
실행 결과 요약
around 1
before
핵심기능 student
around 2
around 1
before
핵심기능 worker
around 2
10-2 AspectJ Pointcut 표현식
@Pointcut("execution(public void get*(..))") // public void인 모든 get 메서드
@Pointcut("execution(* com.javalec.ex.*.*()") // com.javalec.ex 패키지에 파라미터가 없는 모든 메서드
@Pointcut("execution(* com.javalec.ex..*.*()") // com.javalec.ex 패키지 & com.javalec.ex 하위 패키지에 파라미터가 없는 모든 메서드
@Pointcut("execution(* com.javalec.ex.Worker.*()") // com.javalec.ex.Worker 안의 모든 메서드
@Pointcut("within(com.javalec.ex.*)") // com.javalec.ex 패키지 안에 있는 모든 메서드
@Pointcut("within(com.javalec.ex..*)") // com.javalec.ex 패키지 및 하위 패키지 안에 있는 모든 메서드
@Pointcut("within(com.javalec.ex.Worker)") // com.javalec.Worker 모든 메서드
// 아래는 잘 사용하지 않음
@Pointcut("bean(student)") // student 빈에만 적용
@Pointcut("bean(*ker)") // ~ker로 끝나는 빈에만 적용
물론 같은 기능이 XML에도 있다 예제 9-2 ex2 를 참고해서 비교해보자