Skip to content

스프링 AOP를 활용한 매서드 수행시간 측정 #153

@allnight5

Description

@allnight5

로그를 거의 모든 매서드마다 직접 찍어줘야 하는 불편함을 개선하기 위해서, 다음과 같은 코드를 사용했습니다.

Poincut(@Within) 이 아닌 어노테이션을 사용해서 처리했습니다.

아래는 먼저 어노테이션을 정의한 클래스입니다.

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) 
public @interface ExeTimer { 
}

어노테이션을 사용하는 클래스입니다.

@Slf4j
@Aspect
@Component
public class ExecutionTimer {
    // 조인포인트를 어노테이션으로 설정
    @Pointcut("@annotation(com.team.final8teamproject.aop.Timer)")
    private void timer(){}

    // 패키지의 Controller 라는 이름으로 끝나는 패키지에 모두 적용 (매서드만)
    @Pointcut("within(*..*Controller)")
    private void cut(){}
    // 메서드 전 후로 시간 측정 시작하고 멈추려면 Before,
    // AfterReturning으로는 시간을 공유 할 수가 없음 Around 사용!
    @Around("timer()")
    public Object AssumeExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {

        StopWatch stopWatch = new StopWatch();

        stopWatch.start();
        Object proceed = joinPoint.proceed();// 조인포인트의 메서드 실행
        stopWatch.stop();

        long totalTimeMillis = stopWatch.getTotalTimeMillis();

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();

        log.info("실행 메서드: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
        return proceed;
    }
}

AOP를 왜 사용하는지?

AOP를 사용하는 가장 큰 이유는 관심사의 분리입니다.
-> 여러 매서드에 공통되는 기능을 모듈화 하여, 핵심 기능(비즈니스 로직) 밖에서 필요한 시점에 삽입되어 기능하게 합니다.

AOP의 장점은?

중복 코드 제거, 유지보수의 용이성 등이 있을 수 있습니다.

단점은?

핵심 비즈니스 로직의 기능에 영향을 미칠만한 기능은 삽입되어선 안되며, 만약 그럴 시 비즈니스 로직에 문제를 발생시킬 수 있습니다. 특히 Around 어노테이션은 매서드 실행 전,후,익셉션 발생 이후에까지 영향을 미치므로 신중하게 사용해야 합니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions