[Spring] AOP 는 무엇일까 ??

728x90

AOP가 없던 상황

모든 메서드의 호출 시간을 측정할 때 문제가 발생한다.

 

기존 방식

- 시간을 측정하는 공통된 로직은 공통 관심 사항이다.

- 핵심 비즈니스 로직과 섞여 유지보수가 어렵다.

 

기존 방식 코드

public Long join(Member member) {
    long start = System.currentTimeMillis();
        try {
            validateDuplicateMember(member); 
            memberRepository.save(member);
            return member.getId();          // 이 3줄만 핵심 비즈니스 로직이다.
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join " + timeMs + "ms");
        }
    }
}

 

 

AOP

- 시간 측정 로직을 생성해 놓고, 원하는 곳에 적용시킨다.

- 핵심 비즈니스 로직을 깔끔하게 유지할 수 있다.

- @Aspect 를 추가해야 AOP로 사용할 수 있다.

- @Component 로 스프링 빈을 등록하거나, 직접 등록한다.

 

@Around : 적용할 범위를 지정한다.

 

컨트롤러가 가짜 서비스 객체(프록시)를 호출하고,

서비스 객체가 끝난 뒤 joinPoint.proceed( )가 호출되면 그때 진짜 서비스 객체를 실행한다.

 

 

예시 코드

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hello_spring..*(..))")
    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");
        }
    }
}

 

(AOP 실행 결과)

 

 

 

 

 

 

 

 

출처 | 스프링 입문(김영한) - 인프런

728x90