#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 |