애플리케이션을 조금 더 개선시켜 보겠습니다. 현재는 클라이언트 요청에 대한 값 검증이 없는데, spring-boot-starter-validation 의존성을 추가하여 입력값에 대한 검증처리를 해보겠습니다.
먼저, 입력 데이터 유효성 검사를 위해 spring-boot-starter-validation 의존성을 build.gradle 파일에 추가합니다. 이 의존성은 Spring Boot에서 입력 데이터의 유효성을 검증하는 데 필요한 애노테이션과 라이브러리를 제공합니다.
CustomerDto와 AccountDto 클래스에 입력 데이터 유효성 검사를 위해 필요한 애노테이션을 추가합니다.
@NotEmpty: 필드가 비어 있지 않도록 강제합니다.
@Size: 문자열 길이를 제한합니다.
@Email: 이메일 형식을 검증합니다.
@Pattern: 정규 표현식을 사용하여 특정 패턴을 강제합니다.
예시 코드:
public class CustomerDto {
@NotEmpty(message = "Name cannot be null or empty")
@Size(min = 5, max = 30, message = "The length of the customer name should be between 5 and 30")
private String name;
@NotEmpty(message = "Email address cannot be null or empty")
@Email(message = "Email address should be a valid value")
private String email;
@Pattern(regexp = "\\d{10}", message = "Mobile number must be ten digits")
private String mobileNumber;
// Other fields and methods...
}
AccountDto에서도 유사한 방식으로 애노테이션을 추가합니다.
컨트롤러에서 유효성 검사를 활성화하기 위해, @Validated 애노테이션을 클래스 레벨에 추가하고, @Valid 애노테이션을 @RequestBody 앞에 추가합니다.
@RestController
@Validated
public class AccountsController {
@PostMapping("/create")
public ResponseEntity<ResponseDto> createAccount(@Valid @RequestBody CustomerDto customerDto) {
// Controller logic...
}
@PutMapping("/update")
public ResponseEntity<ResponseDto> updateAccount(@Valid @RequestBody CustomerDto customerDto) {
// Controller logic...
}
}
쿼리 파라미터로 직접 입력되는 데이터에 대해서도 @Pattern 애노테이션을 사용해 유효성을 검증합니다.
@GetMapping("/fetch")
public ResponseEntity<CustomerDto> fetchAccountDetails(@RequestParam @Pattern(regexp = "\\d{10}", message = "Mobile number must be ten digits") String mobileNumber) {
// Controller logic...
}
유효성 검사 실패 시 발생하는 예외를 처리하기 위해 GlobalExceptionHandler 클래스에서 ResponseEntityExceptionHandler를 확장하고, handleMethodArgumentNotValid() 메서드를 오버라이드합니다.
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
Map<String, String> validationErrors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
validationErrors.put(fieldName, errorMessage);
});
return new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST);
}
}
이 메서드는 유효성 검사에서 실패한 필드와 관련된 오류 메시지를 클라이언트에게 반환합니다.
모든 코드를 빌드하고, Postman과 같은 도구를 사용해 API를 테스트합니다. 잘못된 입력을 통해 유효성 검사가 제대로 작동하는지 확인합니다. 예를 들어, 9자리 숫자로 된 전화번호나 잘못된 이메일 형식을 입력하여 오류 메시지가 반환되는지 확인합니다.
// 유효성 검사가 실패한 경우 반환 예시:
{
"mobileNumber": "Mobile number must be ten digits",
"email": "Email address should be a valid value"
}