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 |