서버/Spring boot

#AOP

paran21 2022. 2. 7. 16:42

#AOP란?

  • 각 API별 수행해야 할 비즈니스 로직인 핵심기능 외에 부가기능이 있을 수 있다(로그 기록, API 수행시간 저장 등)
  • AOP(Aspect Oriented Programming)을 통해 부가기능을 모듈화 할 수 있다.
  • 스프링에서 제공하는 AOP를 사용해 부가기능을 별도로 설계, 구현할 수 있다.

#스프링 AOP

  • 부가기능을 제공하는 annotation을 사용하면 포인트컷에 맞춰 핵심기능을 구현하기 전/후에 부가기능이 실행된다.
  • DispatcherServlet에서는 이전과 동일하게 controller로 요청을 보내지만 중간에 AOP 프록시 객체가 중간에 삽입되어 부가기능이 실행된다.

#스프링 AOP 어노테이션

  • @Aspect : 스프링 빈(Bean) 클래스에만 적용이 가능하다.

 

@Aspect
@Component
public class UseTimeAop {​

 

어드바이스 종류

  • @Around : '핵심기능' 수행 전과 후(@Before + @After)
  • @Before : '핵심기능' 호출 전
  • @After : '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작(try, catch의 finally()처럼 동작)
  • @AfterReturning : '핵심기능' 호출 성공 시(함수의 return 값 사용 가능)
  • @AfterThrowing: '핵심기능' 호출 실패 시, 즉 예외가 발생한 경우

 

포인트컷

  • Expression 형태 : execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws -pattern?)
  • ?는 생략 가능
    @Around("execution(public * com.sparta.springcore.controller..*(..))")​
  • @Pointcut : 포인트컷 재사용 및 결합이 가능하다.
    @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() { ...
    }​

 

'서버 > Spring boot' 카테고리의 다른 글

#CORS 설정하기  (0) 2022.02.12
#에러처리  (2) 2022.02.07
#ORM, JPA, Spring data JPA, SQL  (0) 2022.02.05
#Spring security  (0) 2022.01.28
#DI, IoC, Bean  (0) 2022.01.28