java, spring

[Spring] AOP, args를 이용한 파라미터 추적

isaac.kim 2021. 8. 21.
728x90
반응형

[Spring] AOP, args를 이용한 파라미터 추적

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^

 

이전 글

2021.08.20 - [Spring] - [Spring]AOP, Aspect-Oriented Programming/관점 지향 프로그래밍 개념 이해하기

2021.08.21 - [Spring] - [Spring] AOP 설정과 실습

2021.08.21 - [Spring] - [Spring] AOP, Java 설정


AOP, args를 이용한 파라미터 추적

반응형

 

LogAdvice가 SampleService의 doAdd( )를 실행하기 직전에 간단한 로그를 기록하지만, 상황에 따라서는 해당 메서드에 전달되는 파라미터가 무엇인지 기록하거나, 예외가 발생했을 때 어떤 파라미터에 문제가 있는지 알고 싶은 경우도 많습니다.

 

LogAdvice에 적용된 @Before("execution(*com.isaac.service.SampleService*.*(..))")은 어떤 위치에 Advice를 적용할 것인지를 결정하는 Pointcut인데, 설정 시에 args를 이용하면 간단히 파라미터를 구할 수 있습니다.

 

LogAdvice 클래스의 일부

 

logBeforeWithParam( )에서는 'execution'으로 시작하는 Pointcut 설정에 doAdd( ) 메서드를 명시하고, 파라미터의 타입을 지정했습니다. 뒤쪽의 '&& args (...' 부분에는 변수명을 지정하는데, 이 2종류의 정보를 이용해서 logBeforeWithParam( ) 메서드의 파라미터를 설정하게 됩니다.

 

기존의 테스트 코드를 실행하면 단순한 로그와 더불어 전달된 파라미터 역시 파악할 수 있습니다.

 

'&& args'를 이용하는 설정은 간단히 파라미터를 찾아서 기록할 때에 유용하지만 파라미터가 다른 여러 종류의 메서드에 적용하는 데에는 간단하지 않다는 단점이 있습니다.

 

이 단점을 해결하는 방법으로 @Around와 ProceedingJoinPoint를 이용해서 해결할 수 있습니다.

(조금 후 다루겠습니다.)


@AfterThrowing

 

코드를 실행하다 보면 파라미터의 값이 잘못되어서 예외가 발생하는 경우가 많습니다. AOP의 @AfterThrowing 어노테이션은 지정된 대상이 예외를 발생한 후에 동작하면서 문제를 찾을 수 있도록 도와줄 수 있습니다.

 

LogAdvice 클래스의 일부

 

테스트 코드를 다음과 같이 수정하여 실행해봅니다. (SampleServiceTests 클래스의 일부)

 

doAdd( )는 숫자로 변환이 가능한 문자열을 파라미터로 지정해야 하는데 고의적으로 'abc'와 같은 문자를 전달하면 다음과 같은 로그를 볼 수 있습니다.

 

테스트 코드 실행결과


@Around와 ProceedingJoinPoint

 

AOP를 이용해 좀 더 구체적인 처리를하기 위해 @Around와 ProceedingJoinPoint를 사용합니다.

 

@Around는 조금 특별하게 동작하는데 직접 대상 메서드를 실행할 수 있는 권한을 갖고 있고, 메서드의 실행 전과 실행 후에 처리가 가능합니다.

 

LogAdvice 클래스의 일부

 

logTime( )의 Pointcut 설정은 '...SampleService*.*(..)' 로 지정합니다. logTime( )은 특별하게 ProceedingJoinPoint라는 파라미터를 지정하는데, ProceedingJoinPoint는 AOP의 대상이 되는 Target이나 파라미터 등을 파악할 뿐만 아니라, 직접 실행을 결정할 수도 있습니다. @Before 등과 달리 @Around가 적용되는 메서드의 경우에는 리턴 타입이 void가 아닌 타입으로 설정하고, 메서드의 실행 결과 역시 직접 반환하는 형태로 작성해야만 합니다.

 

테스트 코드를 실행해 보면 다음 결과를 볼 수 있습니다.

 

실행 결과를 보면 @Around가 먼저 동작하고, @Before 등이 실행된 후에 메서드가 실행되는데 걸린 시간이 로그로 기록되는 것을 볼 수 있습니다.


Spring Framework에서 AOP를 활용할 수 있는 다양한 방법에 대해 알아보았습니다. AOP에 관련된 글이 여러 개 존재하는데 함께 보시면 더 도움이 되실거라 생각됩니다.

 

그럼 좋은 하루 되세요~!

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
728x90
반응형