AOP
Aspect Oriented Programming 관점 지향 프로그래밍
weaving : class 파일을 조작하는 기술
라이브러리를 통해 weaving 을 사용할 수 있다.
인터셉터와는 다름.
실행
<*ServiceImpl.java의 모든 메소드가 완료되는데 까지 얼마나 시간이 걸리는지 확인_성능 점검>
AOP Library Dependency 추가
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Aspect // AOP 모듈
@Component // Spring Bean으로 생성
public class TimingAspect {
}
공통코드가 개입할 시점 정의
@Pointcut : weaving을 해줄 대상 지정
com.example.demo 하위의 service 패키지 내부에 있는 ServiceImpl로 끝나는 클래스의 모든 메소드가 실행될 때
@Aspect // AOP 모듈
@Component // Spring Bean 생성해주는 Annotation
public class TimingAspect {
private Logger logger = LoggerFactory.getLogger(TimingAspect.class);
/**
* <pre>
* AOP를 적용할 대상을 지정.
* execution() : 실행단계에서 적용할 대상을 지정.
* public : public 접근 제어자를 사용하는 것을 대상으로 한다.
* * : 모든 반환타입을 대상으로 한다.
* com.hello.forum..service.*ServiceImpl : com.hello.forum 아래에 있는 모든 패키지 중에서
* service 패키지 내부에 있는
* ServiceImpl로 끝나는 모든 클래스를 대상으로 한다.
* .*(..) : ServiceImpl로 끝나는 모든 클래스 내부의 모든 메소드를 대상.
*
* *ServiceImpl 클래스 밑에 있는 public 모든반환타입 메소드명() 을 대상으로 Aspect 를 실행한다.
* </pre>
*/
@Pointcut("execution(public * com.hello.forum..service.*ServiceImpl.*(..))")
public void aroundTarget() {
}
/**
* <pre>
* 원래 실행될 메소드의 전, 후에 공통코드를 실행한다.
* ServiceImpl에 있는 메소드가 실행될 때(Pointcut 대상이 실행될 때)
* 아래 메소드가 실행된다. - Weaving된 코드가 실행된다.
* </pre>
*
* @param pjp 원래 실행될 클래스와 메소드의 정보
* @return 원래 실행될 메소드의 반환 값.
*/
// @Before
// @After
// @AfterReturning
// @AfterThrowing
@Around("aroundTarget()") // 위 4가지를 @Around가 한번에 처리.
public Object timingAdvice(ProceedingJoinPoint pjp) {
return null;
}
logback.xml 파일 / TimingAspect class
<appender name="TIMING_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>C:/logs/hellospring_timing.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>C:/logs/hellospring_timing.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<logger name= "timing" level="debug">
<appender-ref ref="TIMING_LOG"/>
</logger>
추가해주면 걸린시간만 따로 확인 가능