테스트 케이스를 작성 중에 시스템 단위 테스트를 하는데, 단위 테스트 범위가 Mapper에 들어가 있어서 정확히 시간테스트를 진행할 수 없었다. Mapper은 Xml파일에서 얼마나 빠른 속도로 SQL을 통해 DB에서 데이터를 끌어올 수 있는지를 체크해야하는데, 정확한 시간을 잡아낼 수 없었다.
원래는 @Autowired를 통해 의존성 주입을 하고 사용했는데, 전체 시간 속에서 다른 mapper을 불러오려면 AOP를 활용해서 불러와야 했다.
Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
어떤 로직을 기준으로 핵심적인 관점, 북적인 관점으로 나누었느냐, 그리고 그 관점으로 모듈화 한다는 것이다.
@Aspect
@Component
public class testAspect
이런 식으로 클래스에 @Aspect를 이용해서 Aspect클래스라는 것을 명시한다. 그리고 @Component를 붙여
스프링 빈으로 등록한다.
@Around("excution(경로))
public Object test(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.nanoTime();
Object result = joinPoint.proceed();
long end = System.nanoTime();
}
이런 식으로 @Aspect를 이용해서 타겟 메서드를 감싸서 특정 Advice를 실행하겠다는 것이다. excution에 붙은 경로는 패키지 경로가 들어간느데, 이는 특정 객체 아래에 모든 메서드에 Aspect를 적용한다는 것이다.
테스트에 적용하는 것은 간단하다. 기본적으로 Junit 테스트를 진행하는 것과 동일하게 작동하기 때문에
차이점은 없고 이번에 할 테스트는 전체 시간중에서 얼마나 그 메서드가 동작하는지 확인하는 것이기 때문에 전체 시간을 재고 그 시간과 AOP로 호출한 Service계층의 속도를 비교할 것이다.
@Autowired
private SelectAOP selectAop; // AOP 클래스
@Autowired
private SelectController controller;
@Test
void getExecutionTime(){
long start = System.nanoTime();
controller.getExecution();
long end = System.nanoTime();
long methodExecutionTime = selectAop.getMethodExecutionTime();
이런 식으로 적용해서 각각의 시간을 잴 수 있다.
이렇게 AOP를 호출해서 하면 좋은 점이 안에 있는 메서드를 따로 테스트에 호출하지 않아도
geExecution이 실행되면서 발생하는 DB커넥션 테스트를 진행 할 수 있다.