[스프링 부트] 19. 유효성 검사 (Validation) - 웹 게시판 v3.1

KangHo Lee's avatar
Nov 21, 2024
[스프링 부트] 19. 유효성 검사 (Validation) - 웹 게시판 v3.1
💡
필요한 라이브러리
  • Spring Boot Starter AOP
  • Spring Boot Starter Validation

1. 유효성 검사를 위한 Validation Aspect 클래스

@Component @Aspect public class MyValidationAspect { // PostMapping 실행 전 후로 실행 @Around("@annotation(org.springframework.web.bind.annotation.PostMapping)") // 포인트컷 public Object validationCheck(ProceedingJoinPoint jp) throws Throwable { // JoinPoint : 해당 메서드의 모든 정보가 있다. Object[] args = jp.getArgs(); for (Object arg : args) { // Errors가 있을 경우 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 ob = jp.proceed(); // Controller 메서드 실행 System.out.println("직후"); return ob; // Controller 메서드 반환값을 디스패처 서블릿에 전달 } }
💡
@Aspect 어노테이션에는 @Component 어노테이션이 포함되어 있지 않으므로 @Component를 적어줘야 합니다.
  1. 실행 위치를 어노테이션 (@Before, @After, @Around) 으로 정할 수 있습니다.
      • 포인트컷 설정
        • "@annotation(org.springframework.web.bind.annotation.PostMapping)"
        • PostMapping 어노테이션이 있는 컨트롤러 메서드가 실행될 때 Aspect가 실행됩니다.
  1. 메서드의 매개변수인 JoinPoint는 해당하는 컨트롤러 메서드의 모든 정보가 담겨 있습니다.
      • @Arround의 경우 ProceedingJoinPoint 를 매개변수로 받습니다.
  1. jp.getArgs()
      • 해당하는 컨트롤러 메서드의 매개변수 모두를 Object[]로 반환해줍니다.
  1. jp.proceed();
      • 해당하는 컨트롤러 메서드를 실행하는 시점입니다.

2. 유효성 검사가 실행되는 Controller 메서드

@PostMapping("/board/save-form") public String saveV2(@Valid BoardRequest.SaveDTO saveDTO, Errors errors) { boardService.게시글쓰기(saveDTO); return "redirect:/"; }
  • 유효성 검사를 할 객체 앞에 @Valid를 붙입니다.
  • 매개변수에 Errors를 추가합니다.
💡
매개변수를 작성할 때 순서를 조심해야 합니다.
( @Valid BoardRequest.UpdateDTO updateDTO, @PathVariable("id") Integer id, Errors errors )
이런 식으로 @Valid 매개변수와 Errors 객체 사이에 다른 매개변수가 있으면 안됩니다.

3. 유효성 검사를 할 객체 소스 코드

public class BoardRequest { @Data public static class SaveDTO { @Size(min = 2, max = 50) @NotBlank private String title; @NotBlank private String content; public Board toEntity() { Board board = new Board(null, title, content, null); return board; } } @Data public static class UpdateDTO { @NotBlank private String title; @NotBlank private String content; } }
  • 유효성 검사를 할 필드에 어노테이션을 달면 됩니다.

어노테이션 종류

  • @Size
    • String을 대상으로 길이에 대한 조건을 설정합니다.
  • @NotNull
    • 해당 값이 null이면 안됩니다.
  • @NotEmpty
    • 해당 값이 @NotNull + “” 면 안됩니다.
  • @NotBlank
    • 해당 값이 @NotEmpty + “ “이면 안됩니다. → 문자없이 space만 있어도 안됩니다.
  • @Min, @Max
    • 최소값, 최대값을 설정합니다.
  • @Email
    • 올바른 형식의 이메일 주소인지 체크합니다.
 
Share article

devleekangho