@Component // RestController. Service 모든 것들이 Component를 상속해 만들어져 있음
@Aspect
public class ValidationAdvice {
@Around("execution(* com.cos.photogramstart.web.api.*Controller.*(..))")
public Object apiAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// System.out.println("web api 컨트롤러 ====================");
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
if (arg instanceof BindingResult) {
BindingResult bindingResult = (BindingResult) arg;
if (bindingResult.hasErrors()) {
Map<String, String> errorMap = new HashMap<>();
// bindingResult의 getFieldErrors에 다 모아줌, for문 돌면서 에러를 error에 담아줌
for (FieldError error : bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
}
throw new CustomValidationApiException("유효성 검사 실패 :(", errorMap);
}
}
}
// proceddingJointPoint => profile 함수의 모든 곳에 접근할 수 있는 변수
// profile 함수보다 먼저 실행
return proceedingJoinPoint.proceed(); // profile 함수가 실행됨
}
@Around("execution(* com.cos.photogramstart.web.api.*Controller.*(..))")
public Object advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// System.out.println("web 컨트롤러 =====================");
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
if (arg instanceof BindingResult) {
BindingResult bindingResult = (BindingResult) arg;
if(bindingResult.hasErrors()) {
Map<String,String> errorMap = new HashMap<>();
//bindingResult의 getFieldErrors에 다 모아줌, for문 돌면서 에러를 error에 담아줌
for(FieldError error:bindingResult.getFieldErrors()) {
errorMap.put(error.getField(),error.getDefaultMessage());
}
throw new CustomValidationException("유효성 검사 실패 :(",errorMap);
}
}
}
return proceedingJoinPoint.proceed();
}
}
AOP를 활용하면 좀더 코드도 간결하고 보기 쉽다