Language & Framework/Spring
[Spring] Spring AOP에서 요청 파라미터 가져오기
수미수
2023. 10. 19. 13:32
반응형
AOP 로 요청 된 요청 파라미터 검색 하기
요청 파리미터로 검색 하기
AOP 를 통해서 요청 된 파라미터의 이름의 객체를 가져온다. MethodSignature의 parameterNames 메서드를 통해서, 원하는 파라미터의 이름을 indexOf 를 통해서 검색하면 요청된 파라미터의 인덱스 정보를 가져올 수 있다. 그 후 jp.args 에 인덱스 정보를 통해서 접급 하면 이름 기반으로 요청 파라미터를 가져 올 수 있다. 아래는 예제 샘플은 메서드에 ServiceLogging이라는 어노테이션이 적용 되었을 때 가동 되는 샘플 이다.
@Aspect
@Component
class AnnotationBasedLoggerAspect() {
companion object {
private val logger = LoggerFactory.getLogger(this::class.java)
}
@Before("@annotation(.......ServiceLogging)")
fun beforeAop(jp: JoinPoint){
val httpServletRequest: HttpServletRequest = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes).request
logProcess(jp, httpServletRequest)
}
private fun process(jp: JoinPoint, httpServletRequest: HttpServletRequest) {
val args = jp.args
val methodSignature = jp.signature as MethodSignature
try{
val parameterName = methodSignature.parameterNames
val idx = parameterName.indexOf("logParameter")
if (idx >= 0) {
val tmp = args[idx]
if (tmp is LogRequest) {
logger.info("Found")
}
}
} catch (e : Exception){
e.printStackTrace()
}
}
}
클래스 타입으로 검색하기
만약, 요청된 파리미터의 클래스 타입으로 파라미터의 객체를 가져오고 싶으면, 아래 소스와 같이 jp.args 에 filter operator 를 활용하여 가져 올 수 있다. 아래는 메서드에 ServiceLogging이라는 어노테이션이 적용 되었을 때 가동 되는 샘플 이며, 요청 된 파라미터의 클래스 타입이 ParameterClass 인 파라미터 객체를 가져온다.
@Aspect
@Component
class AnnotationBasedLoggerAspect() {
companion object {
private val logger = LoggerFactory.getLogger(this::class.java)
}
@Before("@annotation(.......ServiceLogging)")
fun beforeAop(jp: JoinPoint){
val httpServletRequest: HttpServletRequest = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes).request
logProcess(jp, httpServletRequest)
}
private fun process(jp: JoinPoint, httpServletRequest: HttpServletRequest) {
val args = jp.args
val methodSignature = jp.signature as MethodSignature
try{
val parameterClazz = jp.args.filter { it.javaClass == ParameterClass::class.java }.firstOrNull()
parameterClazz.doSomething();
} catch (e : Exception){
e.printStackTrace()
}
}
}
반응형