Spring AOP

김윤서·2024년 9월 13일
0


1. @Aspect
- Spring 빈(Bean) 클래스에만 적용 가능합니다.

  1. 어드바이스 종류

    • @Around: '핵심기능' 수행 전과 후 (@Before + @After)
    • @Before: '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)
    • @After: '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
    • @AfterReturning: '핵심기능' 호출 성공 시 (함수의 Return 값 사용 가능)
    • @AfterThrowing: '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우만 동작 (ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
  2. 포인트컷
    - 포인트컷 Expression Language
    - 포인트컷 Expression 형태
    포인트컷 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() {
    		...
    	}	
    }

0개의 댓글