Spring Boot 에서는 Validation을 통해 데이터의 유효성을 검증할 수 있다.

 

public class SignUpRequestDto {

	@NotBlank @Email
	private String email;

	@NotBlank @Size(min = 8, max = 20)
	private String password;

	@NotBlank
	private String nickname;

	@NotBlank @Pattern(regexp = "^[0-9]{11,13}$")
	private String telNumber;

	@NotBlank
	private String address;

	private String addressDetail;

	@NotNull @AssertTrue
	private Boolean agreedPersonal;
}

 

회원가입 요청에 대한 DTO 객체이다.

멤버 변수에 annotaion을 적용하여 유효성 검증을 지정할 수 있다.

  1. @NotBlank: 해당 필드가 null이 아니며, 공백을 제외한 길이가 0보다 커야 함을 나타냅니다. 주로 String 타입에 사용됩니다.
  2. @Email: 해당 필드가 이메일 주소 형식에 맞아야 함을 나타냅니다.
  3. @Size(min = x, max = y): 해당 필드의 크기가 지정된 범위 내에 있어야 함을 나타냅니다. min과 max를 통해 최소값과 최대값을 지정할 수 있습니다.
  4. @Pattern(regexp = "패턴"): 해당 필드가 주어진 정규 표현식에 일치해야 함을 나타냅니다. 여기서는 전화번호가 특정 패턴을 따르도록 강제하고 있습니다.
  5. @NotNull: 해당 필드가 null이 아니어야 함을 나타냅니다. 모든 객체 타입에 사용할 수 있습니다.
  6. @AssertTrue: 해당 필드의 값이 true이어야 함을 나타냅니다. 주로 boolean 타입에 사용되며, 약관 동의 여부 확인 등에 사용될 수 있습니다.
  1. @Min(value): 숫자 필드가 지정된 최소값 이상이어야 함을 나타냅니다.
  2. @Max(value): 숫자 필드가 지정된 최대값 이하이어야 함을 나타냅니다.
  3. @Digits(integer, fraction): 숫자 필드가 가질 수 있는 정수 부분과 소수 부분의 자릿수를 지정합니다.
  4. @DecimalMin(value): 숫자 필드가 지정된 값 이상이어야 함을 나타내며, 소수를 허용합니다.
  5. @DecimalMax(value): 숫자 필드가 지정된 값 이하이어야 함을 나타내며, 소수를 허용합니다.
  6. @Future@FutureOrPresent: 해당 필드의 날짜/시간이 현재보다 미래여야 함을 나타냅니다. @FutureOrPresent는 현재 시간도 유효함을 의미합니다.
  7. @Past@PastOrPresent: 해당 필드의 날짜/시간이 현재보다 과거여야 함을 나타냅니다. @PastOrPresent는 현재 시간도 유효함을 의미합니다.
  8. @Positive@PositiveOrZero: 숫자 필드가 각각 양수이거나 0을 포함한 양수여야 함을 나타냅니다.
  9. @Negative@NegativeOrZero: 숫자 필드가 각각 음수이거나 0을 포함한 음수여야 함을 나타냅니다.
  10. @NotEmpty: 컬렉션, 맵, 배열, 문자열 등이 비어있지 않아야 함을 나타냅니다.

 

RequestBody로 받은 DTO를 서버 사이드에서 @Valid 어노테이션을 통해 유효성을 검증한다

public class AuthController {
	
	private final AuthService authService;
	
	@PostMapping("/sign-up")
	public ResponseEntity<? super SignUpResponseDto> signUp(
		@RequestBody @Valid SignUpRequestDto requestBody
		) {
			ResponseEntity<? super SignUpResponseDto> response = authService.signUp(requestBody);
			return response;
	}	


	@PostMapping("/sign-in")
	public ResponseEntity<? super SignInResponseDto> signIn(
		@RequestBody @Valid SignInRequestDto requestBody
	){
		ResponseEntity<? super SignInResponseDto> response = authService.signIn(requestBody);
		return response;
	}
}

 

 

validation fail은 RestController Advice를 통해 예외 처리를 했다.

 

RestControllerAdvice

여런 컨트롤러에 대해서 전역적인 Exeption Handling을 제공한다.

ControllerAdvie + ResponseBody를 합쳐놓은 형태로, 에러 핸들링 ResponseBody로 핸들링에 대해서 객체로 리턴해줄 수 있다.

@RestControllerAdvice
public class BadRequestExceptionHandler {
	
	@ExceptionHandler({MethodArgumentNotValidException.class, HttpMessageNotReadableException.class})
	public ResponseEntity<ResponseDto> validationExceptionHandler(Exception exception) {
		return ResponseDto.validationFailed();
	}
}