Spring AOP란?

금은체리·2023년 11월 30일
0

Spring

목록 보기
45/49

Spring의 AOP 애너테이션

1. @Aspect

  • Spring 빈(Bean) 클래스에만 적용 가능

2. 어드바이스 종류

  • @Around: '핵심기능' 수행 전과 후
    • @Before + @After
  • @Before: '핵심기능' 호출 전
    • ex. Client의 입력값 Validation 수행
  • @After: '핵심기능' 수행 성공/실패 여부와 상관없이 동작
    • try, catch의 finally() 처럼 동작
  • @AfterReturning: '핵심기능' 호출 성공 시
    • 함수의 Return값 사용 가능
  • @AfterThrowing: '핵심기능' 호출 실패 시. 즉, 예외(Exception)가 발생한 경우만 동작
    • ex. 예외가 발생했을 때 개발자에게 email이나 SMS 보냄

3. 포인트컷

  • 포인트컷 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-patter

      • 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 적용


Spring AOP 동작 이해

  • 개념적 이해
  • 스프링 실제 동작
  • 시퀀스 다이어그램 (Sequence Diagram)
    • AOP 적용 전
    • AOP 적용 후
      • Spring이 프록시(가짜 혹은 대리)객체를 중간에 삽입해줌
      • DispatcherServlet과 ProductController 입장에서는 변화가 전혀 존재X
        • 호출되는 함수의 input, output이 완전 동일
        • "joinPoint.proceed()"에 의해서 원래 호출하려고 했던 함수, 인수(argument)가 전달됨
          ➡️ createProduct(requestDto);
profile
전 체리 알러지가 있어요!

0개의 댓글