1. AOP(Aspect Oriented Programming) 개념
> '비즈니스 로직은 아니지만, 반드시 해야 하는 작업'
> 횡단 관심사(cross-concern) : 공통으로 사용되지만, 그 자체가 목적은 아니다.
> 대표적인 예 : 보안 처리, 로그 기록, 문제 발생 시를 대비한 이중 백업 등
2. AOP 관련 용어
용어 | 설명 |
Aspect | 공통 관심사에 대한 추상적인 명칭. 예를 들어 로깅이나 보안, 트랜잭션과 같은 기능 자체에 대한 용어 |
Advice | 실제로 기능을 구현한 객체 |
Join points | 공통 관심사를 적용할 수 있는 대상(작성된 Advice가 활약할 수 있는 위치 의미). Spring AOP에서는 각 객체의 메소드가 이에 해당 |
Pointcuts | 여러 메소드 중 실제 Advice가 적용될 대상 메소드 |
target | 실제 비즈니스 로직을 수행하는 객체 의미. 대상 메소드를 가지는 객체 |
Proxy | Advice가 적용되었을 때 만들어지는 객체 |
Introduction | target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능 |
Weaving | Advice와 target이 결합되어서 프록시 객체를 만드는 과정 |
> Proxy는 일반적인 의미에서는 직접 호출하는 방식이 아니라 간접적인 호출을 하는 것을 의미. 즉 원래 객체인 target을 호출할 때 외부에서 직접 target을 호출하는 것이 아니라, Advice가 적용된 Proxy 객체를 통해서 호출한다는 것을 의미.
3. Advice 종류
타입 | 기능 |
Before Advice | target의 메소드 호출 전 적용 |
After returning | target의 메소드 호출 이후 적용 |
After throwing | target의 예외 발생 후 적용 |
After | target의 메소드 호출 후 예외의 발생에 관계없이 적용 |
Around | target의 메소드 호출 이전과 이후 모두 적용 |
4. 라이브러리 추가
5. root-context.xml 설정
6. CommonAdvice
> INFO로 시작하는 로그가 기록되지 않았다면 /src/main/resources 내 log4j.xml 설정 확인
> @Aspect : AOP 기능을 하는 클래스 선언에 추가
> @Component : 스프링의 빈으로 인식하기 위한 설정
> 'execution'으로 시작하는 구문 : Pointcut을 지정하는 문법 (AspectJ 언어의 문법)
> 실행 시 전달되는 파라미터를 파악하기 위해 ProceedingJoinPoint 사용 (JoinPoint 하위 인터페이스)
Note) org.aspectj.lang.JoinPoint
주요 메소드 | 설명 |
Object[] getArgs() | 전달되는 모든 파라미터들을 Object의 배열로 가져온다. |
String getKind() | 해당 Advice의 타입을 알아낸다. |
Signature getSignature() | 실행하는 대상 객체의 메소드에 대한 정보를 알아낼 때 사용 |
Object getTarget() | target 객체를 알아낼 때 사용 |
Object getThis() | Advice를 행하는 객체를 알아낼 때 사용 |
> ProceedingJoinPoint는 JoinPoint의 모든 메소드를 가지면서도, 직접 target 객체의 메소드를 실행할 수 있는 proceed() 기능이 추가된 형태