소스코드 다운받기

10-1 @Aspect를 이용한 AOP 구현

  1. 의존 설정(pom.xml)
  2. @Aspect 어노테이션을 이용한 Aspect클래스 제작
    1. @Pointcut 메서드를 만들어 사용하는 방법
    2. @Pointcut 메서드를 만들지 않고 바로 적용하는 방법
  3. 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 를 참고해서 비교해보자

참고자료