AOP와 트랜잭션 처리를 통해서 다음과 같은 기능을 완성 할 수 있다.
-개발자가 원하는 코드를 실행하는데 얼마나 시간이 소모되는지 쉽게 알 수 있다.
-개발자는 메소드에 전달되는 파라미터나 리턴 값에 대해서 로그를 기록할 수 있다.
-데이터베이스 상에서 트랜잭션 처리를 설정하여, 성공하는 경우에만 모든 데이터가 완전하게 처리되는 방법 적용할 수 있다.
내가 이해한 AOP
컨트롤러마다 각각의 용도가 있다. 예를들어 로그인, 회원가입, 포스트 보기, 등등..
만약 각 컨트롤러가 실행되고 종료될 때마다 로그를 남겨야 하거나, 사용 시간을 확인하기 위해선
컨트롤러가 시작되고 종료되는 시점에 값이 기록되어야 한다.
그럼 컨트롤러 속에서 시작전에 count를 up 또는 로그 기록을 해주고 기본 동작 수행 후 컨트롤러가 종료 전 db에 저장을 하던가 한다.
근데 만약 컨트롤러가 100개 1000개라면???
벌써 머리가 아프다.. 이런 부가기능에 대해서 한번에 묶어서 처리할 수 있는것이 AOP라고 이해했다.
AOP 코드
package com.spring.springapiprac.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class UseTimeAop {
@Around("execution(public * com.spring.springapiprac.controller..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
// 측정 시작 시간
long startTime = System.currentTimeMillis();
try {
// 핵심기능 수행
Object output = joinPoint.proceed();
return output;
} finally {
// 측정 종료 시간
long endTime = System.currentTimeMillis();
// 수행시간 = 종료 시간 - 시작 시간
long runTime = endTime - startTime;
System.out.println(runTime);
}
}
}
간단히 컨트롤러가 동작이 되는 시간을 측정해봤다.
@Around 어노테이션은 어디에 적용을 할지 정해준다.
내가 작성한 코드는 모든 컨트롤러에 시작 전, 후에 실행되도록 설정했다.
결과는 성공!