[ MyValidationHandler ]
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.PutMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint jp) { Object[] args = jp.getArgs(); //파라미터 (매개변수) System.out.println("크기 : " + args.length); for (Object arg : args) { System.out.println("매개변수 : " + arg); } System.out.println("MyValidationHandler : hello_______________"); } }
이제 Post랑 Put 요청을 잡자!!
@PostMapping과 @PutMapping 어노테이션이 붙은
모든 메서드가 실행되기 전에 특정 로직을 수행하도록 설정해주었다!
[ BoardController ]
@PostMapping("/api/boards") public ResponseEntity<?> save(@Valid @RequestBody BoardRequest.SaveDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글쓰기(reqDTO, sessionUser); return ResponseEntity.ok(new ApiUtil(respDTO)); }
AOP 어노테이션 설정
[ MyValidationHandler ]
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import shop.mtcoding.blog._core.errors.exception.Exception400; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.PutMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint jp) { Object[] args = jp.getArgs(); //파라미터 (매개변수) System.out.println("크기 : " + args.length); for (Object arg : args) { if (arg instanceof Errors) { Errors errors = (Errors) arg; if (errors.hasErrors()) { for (FieldError error : errors.getFieldErrors()) { System.out.println(error.getField()); System.out.println(error.getDefaultMessage()); throw new Exception400(error.getDefaultMessage() + " : " + error.getField()); } } } } System.out.println("MyValidationHandler : hello_______________"); } }
* args = JoinPoint 객체를 통해 얻은 메서드의 파라미터? 목록 * if (arg instanceof Errors) 조건문 파라미터 중에서 Errors 타입인 객체가 있는지 확인. 만약 있으면, 해당 객체를 Errors 타입으로 캐스팅하여 errors 변수에 저장 * 그 후, 조건문을 통해 유효성 검사 과정에서 오류가 발생했는지 확인
Share article