스프링 AOP 이해

송영재·2022년 12월 4일

Spring

목록 보기
34/45
  • 스프링 AOP 동작 이해

    • 개념적 이해

    • 스프링 실제 동작

    • 시퀀스 다이어그램 (Sequence Diagram)

      • AOP 적용 전

      • AOP 적용 후

        • DispatcherServlet 과 ProductController 입장에서는 변화가 전혀 없음
          • 호출되는 함수의 input, output 이 완전 동일
          • "joinPoint.proceed()" 에 의해서 원래 호출하려고 했던 함수, 인수(argument) 가 전달됨 → createProduct(requestDto)
    • 스프링 서버가 기동될 때

      • 핵심 기능 DI 시
      • 프록시 객체를 중간에 삽입
  • 스프링 AOP 어노테이션

    1. @Aspect
      • 스프링 빈 (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.springcore.controller..*(..))")
          public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... }
        • modifiers-pattern
          • public, private, *
        • return-type-pattern
          • void, String, List, *
        • declaring-type-pattern
          • 클래스명 (패키지명 필요)
          • com.sparta.springcore.controller.* - controller 패키지의 모든 클래스에 적용
          • com.sparta.springcore.controller.. - controller 패키지 및 하위 패키지의 모든 클
        • method-name-pattern(param-pattern)
          • 함수명
            • addFolders : addFolders() 함수에만 적용
            • add* : add 로 시작하는 모든 함수에 적용
          • 파라미터 패턴 (param-pattern)
            • (com.sparta.springcore.dto.FolderRequestDto) - FolderRequestDto 인수 (arguments) 만 적용
            • () - 인수 없음
            • (*) - 인수 1개 (타입 상관없음)
            • (..) - 인수 0~N개 (타입 상관없음)
        • @Pointcut
          • 포인트컷 재사용 가능
          • 포인트컷 결합 (combine) 가능
            @Component
            @Aspect
            public class Aspect {
            	@Pointcut("execution(* com.sparta.springcore.controller.*.*(..))")
            	private void forAllController() {}
            
            	@Pointcut("execution(String com.sparta.springcore.controller.*.*())")
            	private void forAllViewController() {}
            
            	@Around("forAllContorller() && !forAllViewController")
            	public void saveRestApiLog() {
            		...
            	}
            
            	@Around("forAllContorller()")
            	public void saveAllApiLog() {
            		...
            	}	
            }

0개의 댓글