Spring 심화 1주차(4)

신성훈·2024년 6월 18일

TIL

목록 보기
40/162
post-thumbnail

오늘의 학습 키워드

  • Spring AOP

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-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 입장에서는 변화가 전혀 없다.

  • 호출되는 함수의 input, output 이 완전 동일합니다.
  • "joinPoint.proceed()" 에 의해서 원래 호출하려고 했던 함수, 인수(argument) 가 전달됩니다.
    → createProduct(requestDto);
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글