[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에 관련된 글이 여러 개 존재하는데 함께 보시면 더 도움이 되실거라 생각됩니다.
그럼 좋은 하루 되세요~!
도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
'java, spring' 카테고리의 다른 글
[Spring] Java 설정을 이용한 트랜잭션 설정 (0) | 2021.08.22 |
---|---|
[Spring] 스프링에서 트랜잭션 관리 (0) | 2021.08.22 |
[Spring] AOP, Java 설정 (0) | 2021.08.21 |
[Spring] AOP 설정과 실습 (0) | 2021.08.21 |
[Spring]AOP, Aspect-Oriented Programming/관점 지향 프로그래밍 개념 이해하기 (0) | 2021.08.20 |