
Spring AOP

@Aspect
-Spring 빈(Bean) 클래스에만 적용 가능합니다.
어드바이스 종류
-@Around: '핵심기능' 수행 전과 후 (@Before + @After)
-@Before: '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)
-@After: '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
-@AfterReturning: '핵심기능' 호출 성공 시 (함수의 Return 값 사용 가능)
-@AfterThrowing: '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우만 동작
(ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
포인트컷
포인트컷 Expression Language
포인트컷 Expression 형태
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
-> ? 는 생략 가능
-> 포인트컷 Expression 예제
@Around("execution(public * com.sparta.myselectshop.controller..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... }
modifiers-pattern
-public, private, *
return-type-pattern
-void, String, List, *
declaring-type-pattern
-클래스명 (패키지명 필요)
-com.sparta.myselectshop.controller.* - controller 패키지의 모든 클래스에 적용
-com.sparta.myselectshop.controller.. - controller 패키지 및 하위 패키지의 모든 클래스에 적용
method-name-pattern(param-pattern)
-함수명
-> addFolders : addFolders() 함수에만 적용
-> add* : add 로 시작하는 모든 함수에 적용
-파라미터 패턴 (param-pattern)
-> (com.sparta.myselectshop.dto.FolderRequestDto) - FolderRequestDto 인수 (arguments) 만 적용
-> () - 인수 없음
-> (*) - 인수 1개 (타입 상관없음)
-> (..) - 인수 0~N개 (타입 상관없음)
@Pointcut
-포인트컷 재사용 가능
-포인트컷 결합 (combine) 가능
@Component
@Aspect
public class Aspect {
@Pointcut("execution(* com.sparta.myselectshop.controller.*.*(..))")
private void forAllController() {}
@Pointcut("execution(String com.sparta.myselectshop.controller.*.*())")
private void forAllViewController() {}
@Around("forAllContorller() && !forAllViewController()")
public void saveRestApiLog() {
...
}
@Around("forAllContorller()")
public void saveAllApiLog() {
...
}
}
Spring AOP 동작 이해
-개념적 이해

-스프링 실제 동작

시퀀스 다이어그램 (Sequence Diagram)
-AOP 적용 전

-AOP 적용 후

-Spring이 프록시(가짜 혹은 대리) 객체를 중간에 삽입.
-DispatcherServlet 과 ProductController 입장에서는 변화가 전혀 없다.