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()
            }
    }
}
반응형