[221026] @Valid

Younseo·2022년 10월 26일
0

TIL Study

목록 보기
7/27

@Valid & @Validated

클라이언트 측에서 넘어온 데이터를 객체에 넣을 때 @Valid@Validated로 유효성 검사를 할 수 있다.

build.gradle에 의존성 추가

dependencies{
    ...
    implementation 'org.springframework.boot:spring-boot-starter-validation'
}

유효성 검사를 위한 어노테이션

Anotation제약 조건
@NotNullNull 불가
@NullNull만 입력 가능
@NotEmptyNull, 빈 문자열 불가
@NotBlankNull, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min=, max=)문자열, 배열 등의 크기가 만족하는가?
@Pattern(regex= )정규식을 만족하는가?
@Max(숫자)지정 값 이하인가?
@Min(숫자)지정 값 이상인가?
@Future현재보다 미래인가?
@Past현재보다 과거인가?
@Positive양수만 가능
@PositiveOrZero양수와 0만 가능
@Negative음수만 가능
@NegativeOrZero음수와 0만 가능
@Email이메일 형식만 가능
@Digits(integer=, fraction=)대상 수가 지정된 정수와 소수 자리 수보다 적은가?
@DecimalMax(value= )지정된 값(실수) 이하인가?
@DecimalMin(value= )지정된 값(실수) 이상인가?
@AssertFalsefalse인가?
@AssertTruetrue인가?

Controller에서 유효성 검사

@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

@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) {
        ...
    }

}

Reference

[Spring] @Valid, @Validated 사용법

0개의 댓글