입력 데이터 유효성 검사

날아올라돼지야·2024년 8월 26일
0

애플리케이션을 조금 더 개선시켜 보겠습니다. 현재는 클라이언트 요청에 대한 값 검증이 없는데, spring-boot-starter-validation 의존성을 추가하여 입력값에 대한 검증처리를 해보겠습니다.

1. 유효성 검사 라이브러리 추가

먼저, 입력 데이터 유효성 검사를 위해 spring-boot-starter-validation 의존성을 build.gradle 파일에 추가합니다. 이 의존성은 Spring Boot에서 입력 데이터의 유효성을 검증하는 데 필요한 애노테이션과 라이브러리를 제공합니다.

2. DTO 클래스에 유효성 검사 애노테이션 추가

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에서도 유사한 방식으로 애노테이션을 추가합니다.

3. 컨트롤러에서 유효성 검사 활성화

컨트롤러에서 유효성 검사를 활성화하기 위해, @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...
}

4. 글로벌 예외 처리기에 유효성 검사 실패 처리 추가

유효성 검사 실패 시 발생하는 예외를 처리하기 위해 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);
    }
}

이 메서드는 유효성 검사에서 실패한 필드와 관련된 오류 메시지를 클라이언트에게 반환합니다.

5. 테스트 및 검증

모든 코드를 빌드하고, Postman과 같은 도구를 사용해 API를 테스트합니다. 잘못된 입력을 통해 유효성 검사가 제대로 작동하는지 확인합니다. 예를 들어, 9자리 숫자로 된 전화번호나 잘못된 이메일 형식을 입력하여 오류 메시지가 반환되는지 확인합니다.

// 유효성 검사가 실패한 경우 반환 예시:
{
"mobileNumber": "Mobile number must be ten digits",
"email": "Email address should be a valid value"
}

profile
무슨 생각하며 사니

0개의 댓글