스프링 AOP

2024. 5. 16. 12:42스프링

반응형

AOP가 필요한 경우

- 모든 메소드의 호출 시간을 측정 하려고 한다. 근데 모든 메소드에 시간 측정 로직을 추가하려면 너무 많은 시간이 소모된다.

 

public List<Member> exampleMethod(){

	long start = System.currentTimeMillis();
    
    try{
    	//메소드 로직 ...
        
    }finally{
    	long finish = System.currentTimeMillis();
        long timeDiff = finish - start;
        
        System.out.println("메소드 걸린시간 " + timeDiff);
    }
    
}

 

 

메소드가 수천개 있으면 위와 같은 작업을 수천개 해야한다. 이때 필요한게 AOP다. 위에 메소드에서 시간 측정하는 로직은 모든 메소드의 공통 관심 사항이다. 그리고 각 메소드의 로직은 핵심 관심 사항이다. 

 

/*
	@Aspect의 어노테이션이 붙은 클래스  Advisor(어드바이저)
	메서드는 Advice
    @Around는 Pointcut으로 Advice를 적용할 대상
    어드바이스를 사용하기 위해서는 꼭 proceed() 메소드를 호출 해줘야 한다.
*/

@Aspect // @Aspect 어노테이션을 이용하여 AOP를 적용
@Component //빈으로 등록해야한다. 컴포넌트 스캔으로 빈 등록
public class TimeTraceAop{

	@Around("execution(* hello.hellospring..*(..))")//hello.hellospring 밑에 모든 메소드에 적용
	public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
    
    	long start = System.currentTimeMillis();
    
        try{
            return joinPoint.proceed();// 실제 메소드 호출

        }finally{
            long finish = System.currentTimeMillis();
            long timeDiff = finish - start;

            System.out.println("메소드 걸린시간 " + timeDiff);
        }
    }

 

위에 aop를 통해서 각 메소드가 호출되기전에 인터셉트를 하여 실제 메소드가 실행되는 시간을 측정했다. 시간을 측정하는 공통 관심사항 로직이 각 메소드 마다 추가할 필요없어서 핵심 관심사항과 분리가 되어 훨씬 깔끔해졌다.  

반응형

'스프링' 카테고리의 다른 글

객체 지향 프로그래밍- SOLID  (1) 2024.05.23
스프링 spring  (0) 2024.05.16
스프링 jdbc 템플릿  (0) 2024.05.16
스프링부트 테스트  (0) 2024.05.14
DI 주입 방법  (0) 2024.05.14