[스프링 부트] 26. 게시판 v3 유효성 검사 추가

lhs's avatar
Nov 21, 2024
[스프링 부트] 26. 게시판 v3 유효성 검사 추가
 

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를 사용하여 titlecontentnull이거나 빈 문자열이 안 되도록 유효성 검사를 추가한다.

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

LHS's Study Space