Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section5_14부

whyWhale 2020. 11. 25.

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 후에 사라지므로 애노테이션이 적용이 안된다.

명시적인 애노테이션으로 금방 구분을 할 수 있을 것이다.

 

@PerLogging 이라는 애노테이션을 적음으로써 해당 proxy를 적용.

 

 

 -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 변수를 선언하고 그 후에 시간을 측정하는 것을 콘솔에 출력할 수 있다.

 

 

 

 

 

 

 

댓글