I/O Validation을 의존성으로 추가해줘야 한다.

 

Bean Validation : 필드 변수가 필요한지 확인하고, 숫자와 길이를 검증하고, 정규 표준식을 사용하여 유효성을 검사할 수 있다.

 

유효성 검사

  • 변수(필드, 파라미터, ...)에 아래의 어노테이션들을 붙여서 각각 변수에 유효성 검사를 할 수 있다.
    • @NotNull : 주어진 값이 Null이면 예외 발생
    • @Min, @Max : 지정된 숫자만큼 글자 수가 존재하지 않으면 예외 발생
    • @Size : 글자 길이가 지정된 숫자와 다르면 예외 발생
    • @Pattern : 정규 표현식을 사용하여 이 패턴과 일치하지 않으면 예외 발생
    • @Future, @Past : 날짜가 미래에 있는지, 과거에 있는지 확인 후 일치하지 않으면 예외 발생
    • [Spring Boot] Validation 적용, @Valid로 유효성 검사하기 (tistory.com) 더 많은 유효성 검사 어노테이션은 이 블로그를 참고하면 된다.
  • 이 때 @NotNull(message="예외 발생시 표시할 내용")와 같이 예외 메세지를 설정할 수 있다.
@Getter
@Setter
public class UserRequestDto {
    @NotBlank
    private String userId;

    @NotBlank
    private String registrationId;

    @NotEmpty
    private String fcmToken;
}

@GetMapping("/v1/user/login-id/validation")
public ApiResponse<Boolean> validateUserLoginId(@Email @NotBlank @RequestParam("loginId") String loginId) {
    boolean response = userQueryService.validateLoginId(loginId);

    return ApiResponse.ok(response);
}

 

아래와 같이 클래스에 있는 필드에 대해서 유효성 검사를 진행하려면 @Valid를 붙여야 한다.

@Setter
public UserRequestDto{
    @NotNull(message="이름을 입력하세요")
    private String name
}

@RestController
public TestController{
    @PostMapping("/api/users")
    public void saveUser(@Valid UserRequestDto userRequestDto){}
}

 

유효성 검사시에 발생하는 예외는 다음 블로그에서 다뤄보도록 하겠다.

 

cf)

  • 만약 클래스 A에 클래스 B 필드가 있을 때 클래스 B 안에 필드까지 유효성 검사를 하려면 클래스 B 필드에 @Valid를 붙여줘야 한다.
  • List안에 일반 타입이 있을 때에 일반 타입에 대해 유효성 검사를 진행하려면 타입명 옆에 어노테이션을 붙여주고, List로 선언된 필드 위에 @Valid를 붙여준다.
  • 만약 @Valid 붙여준 것이 null을 허용하고 실제로 null을 받았을 시에는, 해당 클래스 내부의 유효성 검사를 하지 않는다. 즉, @Valid는 해당 객체가 null이 아닐 때에만 유효성 검사를 진행한다.
public class CalendarUpsertRequestDto {
    @Valid
    @NotNull
    private DateInfoDto dateInfo;

    @NotBlank
    private String title;

    @NotBlank
    private String content;

    @NotNull
    private LocalDateTime startDay;

    @NotNull
    private LocalDateTime endDay;
    
    @Valid
    @Size(max=5)
    private List<@Size(max=10) String> options
}

@Getter
@Builder
@Embeddable
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DateInfoDto {
    @Min(1)
    @NotNull
    private Integer year;

    @Min(1)
    @Max(12)
    @NotNull
    private Integer month;

    @Min(1)
    @Max(31)
    @NotNull
    private Integer day;
}

'Spring Boot' 카테고리의 다른 글

Spring Boot @Scheduled  (0) 2024.08.02
Spring Boot @PathVariable & @RequestParam  (0) 2024.07.28
Spring Boot Dto 참고사항  (0) 2024.07.21
Spring Boot jackson  (0) 2024.07.21
Spring Boot 직렬화 필터링 fear. JSON  (0) 2024.07.14

+ Recent posts