소스코드 다운받기

9-1 AOP(Aspenct Oriented Programming)란?

  • 기억보단 기록을 - AOP 정리(3) 를 읽어보자

  • 용어

    • Aspect: 공통 기능
    • Advice : Aspect의 기능 자체
    • Joinpoint : Advice를 적용해야 되는 부분
    • Pointcut : JoinPoint의 부분으로 실제로 Advice가 적용된 부분 (구멍)
    • Weaving : Advice를 핵심 기능에 적용하는 행위 (꿰매기)
  • 스프링에서는 proxy를 이용해서 AOP를 구현한다

  • Client(호출부) -> Proxy(대행) -> Target(핵심기능)

9-2 XML기반의 AOP구현

  1. 의존 설정(pom.xml)
  2. 공통 기능 클래스 제작 - Advice 역할 클래스 (Proxy)
  3. XML 설정 파일에 Aspect 설정
<!-- 1. 의존 설정 pom.xml -->
<!-- AOP -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.4</version>
</dependency>
// 2. 공통 기능 클래스 제작 LogAop.java
public class LogAop {
    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));
        }
    }
}
<!-- 3. XML 설정파일에 Aspect(공통기능) 설정 applicationCTX.xml -->
<bean id="logAop" class="com.javalec.ex.logAop" />

<aop:config>
    <!-- 여기서 ref는 위에 bean id 값을 가져온 것 -->
    <aop:aspect id="logger" ref="logAop">
        <!-- com.javalec.ex 패키지 밑에 존재하는 모든 클래스에 대해 pointcut(구멍)을 만들고 이름을 publicM 이라고 짓는다 -->
        <aop:pointcut id="publicM" expression="within(com.javalec.ex.*)" />

        <!-- advice (before / after / around(앞뒤둘다) )-->
        <!-- 공통기능 클래스를 publicM 이라는 pointcut에 적용시킨다(Weaving) around 옵션이니까 핵심기능 앞뒤에 pointcut이 생긴다 -->
        <aop:around pointcut-ref="publicM" method="loggerAop" />

    </aop:aspect>
</aop:config>

<bean id="student" class="com.javalec.ex.Student">
    <!-- 코드 생략 -->
    <!-- com.javalec.ex 밑에 있는 클래스니까? 공통기능이 앞뒤로 적용되겠네? -->
</bean>

<bean id="worker" class="com.javalec.ex.Worker">
    <!-- 코드 생략 -->
    <!-- com.javalec.ex 밑에 있는 클래스니까? 여기에도 공통기능이 앞뒤로 적용되겠네? -->
</bean>

실행 결과

Student.getStudentInfo() is start.
이름 : 홍길동
나이 : 10
학년 : 3
반 : 5
Student.getStudentInfo() is finished.
Student.getStudentInfo() 경과시간 : 38
Worker.getWorkerInfo() is start.
이름 : 홍길순
나이 : 55
직업 : 개발자
Worker.getWorkerInfo() is finished.
Worker.getWorkerInfo() 경과시간 : 77
  • 어디가 공통부분이고 어디가 핵심기능인지 구분해서 실행 결과를 살펴보자

9-3 Advice의 종류

  • <aop:before> : 메서드 실행 전에 advice 실행
  • <aop:after-returning> : 정상적으로 메서드 실행 후에 advice 실행
  • <aop:after-throwing> : 메서드 실행중 exception 발생시 advice 실행
  • <aop:after> : 메서드 실행중 exception 이 발생하여도 advice 실행
  • <aop:around>: 메서드 실행 전/후 및 exception 발생시 advice 실행

before와 around가 주로 사용된다고 한다

참고자료