본문 바로가기

강의/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

AOP

AOP란


AOP Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불립니다.

관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것입니다.

여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말합니다.

개념으로는 이해가 안 될 수 있으니 어떤 경우에 어떻게 사용하는지를 알아보도록 하겠습니다.

AOP 사용 예제


모든 메서드의 작업 시간을 측정하고 싶은 상황이라고 가정해보겠습니다.

모든 메서드가 시작되는 부분에 시간을 확인하는 코드와, 메서드가 끝나는 부분에 시간을 확인하는 코드를 입력하고

끝나는 시간에서 시작 시간을 빼서 작업 시간을 확인할 수 있습니다.

 

이런 번거로운 일을 모든 메서드에 적용을 할 생각을 하니 앞이 까마득합니다.

그리고 이런 공통 관심 사항 (작업 시간을 측정하는 코드)에 대한 코드 때문에 메서드의 길이가 길어지고 가독성이 나빠지는 현상이 생겼습니다.

이를 해결하기 위해 공통 관심 사항을 하나의 메서드로 만들어 적용해 보도록 합시다.

 

@Component
@Aspect
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
        // 메서드 시작 시간 확인
        long start = System.currentTimeMillis();
        // 메서드의 시작을 알림
        System.out.println("START: " + joinPoint.toString());
        try {
            // 메서드의 실행
            return joinPoint.proceed();
        } finally {
            // 메서드 끝나는 시간 혹인
            long finish = System.currentTimeMillis();
            // 메서드의 작업 시간을 측정
            long timeMs = finish - start;
            // 메서드의 종료를 알림
            System.out.println("End: " + joinPoint.toString() + " " + timeMs + "ms");
        }
    }
}

 

위와 같이 메서드를 만들면 모든 메서드의 작동 시간을 측정할 수 있습니다.