AOP
- AOP -- Aspect Oriented Programming(관점 지향 프로그래밍)
- 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
aop / TimeTraceAop
package com.danny.learningspring.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Slf4j
@Aspect
public class TimeTraceAop {
@Around("execution(* com.danny.learningspring..*(..)) && !target(com.danny.learningspring.SpringConfig)")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
log.error("MethodName===>{}", joinPoint.getSignature().getName());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
log.error("END=====>{}", timeMs +"ms");
}
}
}
- @Aspect -- AOP를 가능하게 하는 AspectJ 프로젝트에서 제공하는 어노테이션
- @Around("execution(* com.danny.learningspring.service..*(..))") -- 적용 범위 설정
- !target -- Been생성 중복이 되므로 Aspect를 적용하지 않음
- ProceedingJoinPoint -- 호출되는 객체들의 정보에 접근할 수 있는 인터페이스
SpringConfig / 빈 등록
@Bean
public TimeTraceAop timeTraceAop() { return new TimeTraceAop();}
- @Component를 사용하여 컴포넌트 스캔을 이용해 스프링 빈에 등록을 하기도 하지만 AOP는 정형화된 것이라고 보기에 애매하기도 하고 AOP라는 인지가 필요함으로 설정 파일로 따로 관리하는 것을 권장
AOP 적용 후 의존관계
- 실제 스프링빈들 앞에 proxy빈(가짜)을 만들어주고 스프링 컨테이너는 의존성 주입때 proxy빈을 넣어줌
- 실제 빈을 실행할 때도 proxy빈이 수행되고 joinPoint가 각각의 메서드들이 실행될 때 개입해 시간체크를 해주는 방식
- 여기서 joinpoint의 proceed()가 실행될 때, 진짜 memberService를 호출
실행 결과
Success
이미지 출처 - https://www.inflearn.com/course/스프링-입문-스프링부트
'Spring 입문' 카테고리의 다른 글
스프링MVC 입문24 (0) | 2022.11.14 |
---|---|
스프링MVC 입문23 (0) | 2022.11.14 |
스프링MVC 입문22 (0) | 2022.11.14 |
스프링MVC 입문21 (0) | 2022.11.14 |
스프링MVC 입문20 (0) | 2022.11.14 |
댓글