Spring/Framwork

Bean Validation - API JSON 요청 검증

밍구밍구밍 2024. 6. 6. 17:17

API 호출 시 검증 로직(Controller) 를 생성하고 몇가지 테스트를 진행하여 검증에 실패하는 이유와 컨트롤러 자체가 실행 되지 않는 이유에 대해 이해 하고자 합니다.

@Data
public class ItemSaveForm {

    @NotBlank
    private String itemName;

    @NotNull
    @Range(min = 1000, max = 1000000)
    private Integer price;

    @NotNull
    @Max(value = 9999) // value 속성 필수!!
    private Integer quantity;
}

** ItemSaveForm 클래스 및 조건 정의  = 객체 타입 및 최대값, 최소값 설정

 

@Slf4j
@RestController
@RequestMapping("/validation/api/items")
public class ValidationItemApiController {

    @PostMapping("/add")
    public Object addItem(@RequestBody @Validated ItemSaveForm form, BindingResult bindingResult) {

        log.info("API 컨트롤러 호출");
        // api 로 호출 시 ItemSaveForm 에 대한 객체를 호출 한다. 이 때 컨트롤러가 동작한다
        // 컨트롤러 동작하지 않는 경우 : 호출하려는 ItemSaveForm 객체 타입이 맞지 않을 경우 Integer price != String price 값 입력
        // ex ) 현재 ItemSaveForm 의 price 는 Integer 로 선언 되었다 그러나 호출 시 문자열 "qq" 로 호출하게 되면 컨트롤가 자체가 동작하지 않고 .DefaultMessageSourceResolvable 에러가 발생한다.


        if (bindingResult.hasErrors()) {
            log.info("검증 오류 발생 errors={}", bindingResult);
            return bindingResult.getAllErrors();
        }

        log.info("성공 로직 실행");

        return form;
    }

}

** 검증 및 등록하려는 ItemSaveForm 의 객체를 api 호출 시 검증하는 컨트롤러 생성

 

API 호출 시 검증은 3가지로 나눈다

  • 성공 요청 : 성공
  • 실패 요청 : JSON을 객체로 생성하는 것 자체가 실패함
  • 검증 오류 요청 : JSON을 객체로 생성하는 것은 성공 했지만, 검증에서 실패함

 

 

 

코드를 통해 각각의 사례를 이해하기

1. 성공 요청 (생성하려는 타입과 조건이 모두 만족하는 경우)

 

** 성공 (모든 조건에 만족)

1) API 호출하는 객체 타입과 ItemSaveForm 클래스 내의 객체 타입이 동일하고, 정의된 조건이 모두 만족 하는 경우.

 

2. 실패 요청 (생성하려는 타입의 객체가 다른 경우) - 예외 발생

ItemSaveForm 내의 price 변수 타입은 Integer 로 선언 되어 있다.

 

그러나 api 호출에서는  문자열인 "QQQQQ" 인 String 타입의 객체를 생성 하려고 하기 때문에 Controller 클래스도 동작 하지 않는 것이고 검증 조차 하지 않고 400 status error 가 발생한다. (아래는 json parse error 이다)

현재 Integer 타입의 객체가 들어와야 되는데 from String "QQQQQ" 가 들어왔다는 메세지를 출력한다.

 

3. 검증 오류 요청 (생성하려는 타입은 만족하지만, 조건이 다른 경우)

API 요청을 보면 quantity 수량을 10,000 개로 설정 하여 요청하려고 한다.

quantity 수량은 Max 9999 개로 제한 되어 있다.

현재는 컨트롤러는 동작한다. 또한 정의한 타입과 api 호출 시 타입이 같기 때문에 검증 로직도 수행하는 것을 볼 수 있다. 그러나 ItemSaveForm 의 quantity 의 조건이 최대 9999 이고 api 에서 원하는 값이 10000 개로 조건이 false 가 되기 때문에 현재 api 에서 검증 실패 응답이 뜨고 아래와 같이 로그가 출력 된다.