스프링 9강 - AOP란? (1/2) XML로 AOP 구현
November 09, 2018
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구현
- 의존 설정(pom.xml)
- 공통 기능 클래스 제작 - Advice 역할 클래스 (Proxy)
- 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가 주로 사용된다고 한다