1) 스프링 AOP?

2) AOP 용어

3) 스프링 AOP를 적용한 프로젝트 코드 예시 - 1

@Aspect
@Component
class ValidationAspect {

    private val log = LoggerFactory.getLogger(java.class)

   // @After("execution(* beyond.crud_sql.controller..*(..))")
   // @Before("execution(* beyond.crud_sql.controller..*(..))")
    @Around("execution(* beyond.crud_sql.controller..*(..))")
    fun doValidation(joinPoint: ProceedingJoinPoint) {
        val args = joinPoint.args
        log.info("[trace] {} args={}", joinPoint.signature, args)

        for (arg in args) {
            if (arg is BindingResult) {
                if (arg.fieldErrors.size > 0) {
                    val errors = mutableMapOf<String?, MutableList<String>?>()
                    for (e in arg.fieldErrors) {
                        if (errors[e.field] == null) errors[e.field] = mutableListOf()
                        errors[e.field]!!.add(e.defaultMessage!!)
                    }
                    throw ClassValidatorException("유효성 검사 에러입니다.", errors)
                }
            }
        }

        joinPoint.proceed() // @Around에서는 항상 필요 (그래야 조인 포인트가 실행이 됨)
    }
}