: 관점 지향
프로그래밍
스프링 어플리케이션은 대부분 특별한 경우를 제외하고는 MVC 웹 어플리케이션에서는 Web Layer, Business Layer, Data Layer 로 정의.
스프링 DI가 의존성(new) 주입이라면,
스프링 AOP는 로직(code) 주입
이라고 볼 수 있다.
로깅
, 보안
, 트랜잭션
, validation
등등 공통된 기능을 모아놓아 반복적으로 나타나는 부분이 있는데 이를 횡단관심(cross-cutting concern)이라고 한다.
✨ AOP는 핵심 비즈니스 로직에 영향을 받게 하지 않고 반복적인 공통 부분을
모듈화
해 몰아주는 기술이다.
횡당관심으로 뭐가 있을까?
ex. 로깅, 시간측정, 보안, 트랜잭션 등
출처: https://expert0226.tistory.com/200 [여름나라겨울이야기]
만약, 모든 메서드의 호출 시간을 측정하고 싶다면?
@Component
@Aspect
public class TimeTraceAop {
/**
* AOP 설정
* @param joinPoint 실행할 메소드
* @return 실행 결과
* @throws Throwable 예외 발생 시
*/
@Around("execution(* com.dsg.mallapi..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
/**
* 시간 측정 AOP
* 메서드마다 적용
*/
@Component
@Aspect
public class TimeTraceAop {
/**
* AOP 설정
* @param joinPoint 조인 포인트
* @return 실행 결과
* @throws Throwable 예외 발생 시
*/
// execution(* com.dsg.mallapi..*(..))
@Pointcut("execution(* com.dsg.mallapi..*(..))")
private void timeTracePointcut() {}
@Around("timeTracePointcut()")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
✨ Aspect
: 모듈
- Advice와 Pointcut의 조합
부가기능
을 의미하는 데 쓰인다.@Aspect
: 클래스에 AOP 설정을 붙여주는 어노테이션✨ JointPoint
: 합류 지점, 메소드 실행시점
- 횡단 공통(Crosscutting Concerns) 모듈이 삽입되어 동작할 수 있는 실행 가능한 특정 위치
- 메소드 호출, 메소드 실행 자체, 클래스 초기화, 객체 생성 시점 등
✨Pointcut
: 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이다.
- Pointcut은 어떤 클래스의 어느 JoinPoint를 사용할 것인지를 결정하는 필터 패턴
✨ Around
: 대상 메서드의 실행 전후에 Aspect가 적용될 수 있게 도와준다.
@Around
어드바이스는 대상 메서드의 실행을 감싸서 전/후 처리를 수행할 수 있습니다.✨ Advice
: 프록시가 호출하는 조언(부가 기능) 단순하게 프록시 로직이라 생각하면 된다.
- Advice는 관점(Aspect)의 실제 구현체로 결합점에 삽입되어 동작할 수 있는 코드
Advisor
: 단순하게 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것이다. 쉽게 이야기해서 Pointcut + Advice
이다.
Weaving
:
- Pointcut으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정.
- Weaving을 통해서 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.
즉, AOP는
JoinPoint를 실행 → Pointcut으로 지정한 메소드가 호출되는 순간 Advice 메소드가 실행
Advice 메소드 삽입→ Aspect 설정에 따라 Weaving 처리.
@Timer
✨@Aspect
: 자바에서 널리 사용하는 AOP 프레임워크에 포함되며, AOP를 정의하는 class에 해당
✨@Pointcut
: 기능을 어디에 적용시킬지, 메소드? Annotation? 등 AOP를 적용시킬 지점을 결정
✨ @Around
: Before / after 모두 제어
@Before
: 메소드 실행하기 이전
@After
: 메소드가 성공적으로 실행 후, 예외가 발생되더라도 실행
@AfterReturing
: 메소드 호출 성공 실행 시 (Not Throws)
@AfterThrowing
: 메소드 호출 실패 예외 발생 (Throws)
1) Before Advice : 포인트컷으로 지정된 메소드를 호출 시 메소드가 실행되기 전에 처리할 내용을 기술하기 위해 사용
2) After Returning Advice : 포인트컷으로 지정된 메소드가 정상적으로 실행되고 나서, 메소드 수행 결과로 생성된 데이터를 리턴하는 시점에 동작. 비지니스 메소드의 결과로 얻은 결과 데이터를 이용하여 사후 로직을 추가할 때 사용된다.
3) After Throwing Advice : 포인트컷으로 지정한 메소드가 실행되다가 예외가 발생하는 시점에 동작. 예외 처리 어드바이스를 설정할 때 사용한다.
4) After Advice : 예외 발생 여부에 상관없이 무조건 수행되는 어드바이스를 등록할 때 사용.
5) Around Advice : 다른 Advice는 실행 전/후의 수행되는 처리를 위해서 설정했다면 Around Advice는 클라이언트의 메소드 호출을 가로챈 뒤 실행 전/후의 처리를 동시에 처리할 수 있다.