AOP 애노테이션
의존성 추가(pom.xml 에 추가)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Aspect 사용법. (흩어져있는 것.)-> 해야할 일과 어디에 적용할 것인가 advise Pointcut 정의.
@Aspect
빈으로 등록(만약 컴포넌트 스캔을 사용한다면 @Component 추가)
Pointcut 사용법. (어디클래스들에 사용되는 정보)
@Pointcut
주요 표현식
-exectuon : EventService를 상속받은 모든 메소드에 적용한다. 따로따로 각 메소드에 적용할 수 있지만 모든 메소드를 처리할 때 사용하기를 권장한다.
ex) @Around("execution(* com.example..*.EventService.*(..))") -> 해석 : com.example 패키지 안에 있는 모든 클래스 중에서 EventService안에 들어있 는 모든 메소드에 적용하겟다.
* "" ->여안에는 포인트 컷, 또는 직접 포인트 컷 정의 가능.
즉 포인트컷을 정의 한것.(여러 어드바이스에서 재사용할게 아니라면 사용해도 무방.
-@annotation -> @Around("@annotation(PerLogging)")
+ PerLogging이라는 ------------->@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerLogging {
}
위에서 execution 은 모든 메소드에 적용할 때 사용하기를 권장한다고 했다. 각 메소드에 적용할 수 있는 것이 바로 annotion 이다. 먼저. perfLogging 이라는 인터페이스 생성하여 @Document,@Target,@Retention 애노테이션을 붙이고 interface->@interface 로 고친다.
RetentionPolicy는 기본값이 class 이다.정의하자면, 이 애노테이션 정보를 얼마나 유지할 것인가이다.
컴파일후 .java -> .class 가 만들어지는 과정까지 이애노테이션 정보가 바이트 코드까지 남아있게 된다.
그래서 이 애노테이션을 붙이기만 컴파일 후에도 바이트코드에 이 정보가 저장되어 사용이 가능하다.
또한 @Retention(RetentionPolicy.SOURCE) 것도 있는데 이것은 compile 후에 사라지므로 애노테이션이 적용이 안된다.
명시적인 애노테이션으로 금방 구분을 할 수 있을 것이다.
-bean -> @Around("bean(simpleEventService)") 빈이 가진 모든 public 에 적용.
포인트컷조합
- &&,||,!
Advise 사용법.(할일)
@Before
해당 메소드가 실행되기 이전에 먼저 실행되게 하는 것이다.
@AfterReturning
@AtterThrowing
@Around
+ @Around("@annotation(PerLogging)")
+ @Around("bean(simpleEventService)")
+ @Around("execution(* com.example..*.EventService.*(..))")
//ProceedingJoinPoint -> advice 적용 대상 이벤트 create,publish
Object retVal=pip.proceed();
return retVal;
pip.proceed()메소드 전에 후에 무언가 할 수 있음.(start, 밑에 시간 출력.) | 에러가 났을때 특정한 일도 가능.
target에 매소드 호출하고 결과값 리턴해주니깐 아무런 부가적 기능 일어나지 않는다.
그 후에 특정 할일을 정의 하고 해당 어떤 클래스에 적용할 것이지에 대한 부가적인 기능을 할 수 있도록 추가해주면 사용이 가능하다.
그래서 메소드의 실행시간을 측정하는 start 변수를 선언하고 그 후에 시간을 측정하는 것을 콘솔에 출력할 수 있다.
'Spring > Spring_CoreTechnologies' 카테고리의 다른 글
SpringFrameWork CoreTechnition_section_마무리 (0) | 2020.11.29 |
---|---|
SpringFrameWork CoreTechnition_section6_15부 (0) | 2020.11.29 |
SpringFrameWork CoreTechnition_section5_13부 (0) | 2020.11.24 |
SpringFrameWork CoreTechnition_section5_12부 (0) | 2020.11.24 |
SpringFrameWork CoreTechnition_section4_11부 (0) | 2020.11.20 |
댓글