클라이언트 측에서 넘어온 데이터를 객체에 넣을 때 @Valid
와 @Validated
로 유효성 검사를 할 수 있다.
dependencies{
...
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
Anotation | 제약 조건 |
---|---|
@NotNull | Null 불가 |
@Null | Null만 입력 가능 |
@NotEmpty | Null, 빈 문자열 불가 |
@NotBlank | Null, 빈 문자열, 스페이스만 있는 문자열 불가 |
@Size(min=, max=) | 문자열, 배열 등의 크기가 만족하는가? |
@Pattern(regex= ) | 정규식을 만족하는가? |
@Max(숫자) | 지정 값 이하인가? |
@Min(숫자) | 지정 값 이상인가? |
@Future | 현재보다 미래인가? |
@Past | 현재보다 과거인가? |
@Positive | 양수만 가능 |
@PositiveOrZero | 양수와 0만 가능 |
@Negative | 음수만 가능 |
@NegativeOrZero | 음수와 0만 가능 |
이메일 형식만 가능 | |
@Digits(integer=, fraction=) | 대상 수가 지정된 정수와 소수 자리 수보다 적은가? |
@DecimalMax(value= ) | 지정된 값(실수) 이하인가? |
@DecimalMin(value= ) | 지정된 값(실수) 이상인가? |
@AssertFalse | false인가? |
@AssertTrue | true인가? |
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
@Slf4j
@CrossOrigin(origins = "*")
public class PostController {
private final PostService postService;
@PostMapping("/posts")
public GlobalResponseDto createPost(@RequestParam(value = "img", required = false) MultipartFile multipartFile,
@RequestParam(value = "title") @Valid String title,
@RequestParam(value = "contents") @Valid String contents,
@RequestParam(value = "tag") @Valid String tag,
@AuthenticationPrincipal UserDetailsImpl userDetails) throws IOException {
if (userDetails == null) {
throw new CustomException(ErrorCode.UnAuthorized);
}
PostRequestDto postRequestDto = new PostRequestDto(multipartFile, title, contents, tag);
return postService.createPost(multipartFile, postRequestDto, userDetails.getAccount());
}
이런식으로 Controller
에서 @Valid
를 통해 적용할 수 있다!
@Validated
어노테이션은 스프링에서 제공하는 @Valid
기능을 확장한 어노테이션이다. 그룹핑 목적으로 사용한다. @Valid
를 사용하면 필드에 적용된 모든 어노테이션에 대한 검증이 이뤄지므로, 특정 필드만 유효성 검사를 하고 싶은 경우에는 필드를 grouping
하여 일부만 유효성 검사를 할 수 있다.
Example
✔ 그룹을 지정하기 위한 용도의 클래스를 하나 생성하고, 그룹 별 interface를 클래스 내에 생성한다.
✔ 적용할 필드에 그룹을 적용한다
✔Controller에 유효성 검사를 적용한다.
public class ValidationGroups {
public interface groupA {};
public interface groupB {};
}
public class Article {
private Long id;
@NotEmpty(group = {ValidationGroups.groupA.class})
private String title;
@NotEmpty(group = {ValidationGroups.groupB.class})
private String content;
...
}
@RestController
public class ArticleController {
...
@PostMapping("/article/write")
public ResponseEntity articleWrite(@RequestBody
@Validated(ValidationGroup.groupB.class) Article article) {
...
}
}