1. BoardRequest
public class BoardRequest {
@Data
public static class SaveDTO {
@NotBlank
private String title;
@NotBlank
private String content;
public Board toEntity() {
Board board = new Board(null, title, content, null);
return board;
}
}
@Data
public class UpdateDTO {
@NotBlank
private String title;
@NotBlank
private String content;
}
}
@NotBlank
를 사용하여title
과content
가 null이거나 빈 문자열이 안 되도록 유효성 검사를 추가한다.
2. BoardController
@RequiredArgsConstructor
@Controller
public class BoardController {
private final BoardService boardService;
@PostMapping("/board/{id}/update")
public String update(@PathVariable Integer id, @Valid BoardRequest.UpdateDTO updateDTO, Errors errors) {
boardService.게시글수정(id, updateDTO);
return "redirect:/board/" + id;
}
@PostMapping("/board/save")
public String save(@Valid BoardRequest.SaveDTO saveDTO, Errors errors) {
boardService.게시글쓰기(saveDTO);
return "redirect:/";
}
}
- 입력받는 DTO 매개변수에
@Valid
어노테이션을 사용하여 유효성 검사를 한다.
- 유효성 검사 오류가 있을 경우,
Errors errors
매개변수로 검증 에러 정보를 받을 수 있다.
3. MyValidationAspect
@Component
@Aspect
public class MyValidationAspect {
@Around(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)") // 포인트컷 자리
public Object validationCheck(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if (arg instanceof Errors) {
Errors errors = (Errors) arg;
if (errors.hasErrors()) {
String errMsg = errors.getFieldErrors().get(0).getField() + " : " + errors.getFieldErrors().get(0).getDefaultMessage();
throw new Exception400(errMsg);
}
}
}
System.out.println("직전");
Object object = joinPoint.proceed();
System.out.println("직후");
return object;
}
}
@Aspect
AOP의 Aspect 클래스를 정의하는 어노테이션
@Aspect
어노테이션에는@Component
어노테이션이 없기 때문에 추가하여 스프링 빈에 등록되게 한다.
@Around(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)")
- 포인트 컷을 정의하는 어노테이션
@PostMapping
어노테이션이 있는 모든 메서드를 대상으로 설정한다.
ProceedingJoinPoint joinPoint
- 메서드 실행을 가로채고 제어할 수 있는 객체
- 실행 중인 메서드의 정보를 가지고 있다.
getArgs()
메서드를 사용하여 매개변수를 가져온다.
for
문을 사용하여 매개변수 중Errors
를 찾는다.
- 찾은 매개변수를
Errors
로 다운 캐스팅하여 에러가 있을 경우 예외를 던진다.
proceed
메서드로 기존 메서드를 실제로 실행하고 반환값을object
에 저장한다.
- 모든 작업이 종료되면
object
를 반환한다.
Share article