
[ 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