JAVA 테스트케이스 (3)

승환·2025년 1월 18일

📌 문제

테스트 케이스를 작성 중에 시스템 단위 테스트를 하는데, 단위 테스트 범위가 Mapper에 들어가 있어서 정확히 시간테스트를 진행할 수 없었다. Mapper은 Xml파일에서 얼마나 빠른 속도로 SQL을 통해 DB에서 데이터를 끌어올 수 있는지를 체크해야하는데, 정확한 시간을 잡아낼 수 없었다.

원래는 @Autowired를 통해 의존성 주입을 하고 사용했는데, 전체 시간 속에서 다른 mapper을 불러오려면 AOP를 활용해서 불러와야 했다.


📌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커넥션 테스트를 진행 할 수 있다.

profile
왕초보 학부생

0개의 댓글