aop 처리를 위한 weaving 의존 추가
pom.xml에 aop 처리를 위한 weaving 의존 추가
AspectJ와 한 팀임(위에 추가되어 있는 dependency)
> common 밑에 aop 패키지 만들기
> common\aop 밑에 LoggerAspect 클래스 만들기
LoggerAspect 클래스
joinPoint 메소드 시그니쳐 확인
> Signature signature = joinPoint.getSignature();
클래스 레벨에 @Component, @Aspect 선언
@Pointcut, @Around등을 설정해주고
> 이후 어노테이션들을 잘 처리하기 위해 xml에 등록이 필요함
> WEB-INF\spring\appServlet\servlet-context.xml
> 아래 코드 추가
<aop:aspectj-autoproxy/>
(application-context의 transaction관련 빈 설정을 가져와서 적용하는 일도 함)
> Namespaces > aop 체크 > 설정 끝
joinPoint에 화살표 모양 생김
aop에 사용된 controller, service객체 확인(proxy 객체)
proxy객체
1. 인터페이스 구현객체 : jdk동적proxy객체
2. 일반 객체 : cglib를 사용한 proxy객체
joinPoint를 어디에 둘지 생각하고 그에 상응하는 Advice를 사용하면 됨
Advice의 다섯가지타입
1. Around Advice
2. Before Advice
3. After Advice
4. AfterReturning Advice
5. AfterThrowing Advice
@실습문제
insertMemo요청의 실행시간을 구해 로깅하기
Hint! 스프링의 StopWatch클래스를 사용
@Component
@Aspect
@Slf4j
public class RuntimeCheckAspect {
@Pointcut("execution(* com.kh.spring.memo.controller.MemoController.insertMemo(..))")
private void pointcut() {
}
@Around("pointcut()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
//시작전 체크
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object obj = joinPoint.proceed();
//끝난후 체크
stopWatch.stop();
long millis = stopWatch.getTotalTimeMillis();
log.debug("insertMemo 소요시간 : {} ms", millis);
return obj;
}
}
aop는 주업무와 보조업무를 완벽하게 분리했다는것이 의미있음(oop를 더 oop스럽게 만들어줌)!
'프로그래밍 > Spring' 카테고리의 다른 글
10.27(LoginInterceptor, MultipartFile ) (0) | 2020.10.27 |
---|---|
10.26(RequestParam, Pointcut, rowbounds, formatDate) (0) | 2020.10.26 |
10.22(AOP의 이해, @Slf4j) (0) | 2020.10.22 |
10.21(query & resultset logging) (0) | 2020.10.21 |
10.20(Model, log4j, Handler Interceptor) (0) | 2020.10.20 |