필요한 라이브러리
- 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를 적어줘야 합니다.
- 실행 위치를 어노테이션 (@Before, @After, @Around) 으로 정할 수 있습니다.
- 포인트컷 설정
- "@annotation(org.springframework.web.bind.annotation.PostMapping)"
- PostMapping 어노테이션이 있는 컨트롤러 메서드가 실행될 때 Aspect가 실행됩니다.
- 메서드의 매개변수인 JoinPoint는 해당하는 컨트롤러 메서드의 모든 정보가 담겨 있습니다.
- @Arround의 경우 ProceedingJoinPoint 를 매개변수로 받습니다.
- jp.getArgs()
- 해당하는 컨트롤러 메서드의 매개변수 모두를 Object[]로 반환해줍니다.
- 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
- 최소값, 최대값을 설정합니다.
- 올바른 형식의 이메일 주소인지 체크합니다.
Share article