AOP를 이용한 validation

OUO·2022년 4월 30일
0
post-thumbnail

@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를 활용하면 좀더 코드도 간결하고 보기 쉽다

profile
develoops!er

0개의 댓글