[Spring] @RequestBody 가 List일때 Validation체크 v1

yeonjoo913·2023년 6월 27일
0

Spring

목록 보기
7/19

이전글에서 @RequestBody가 하나의 객체일때 유효성 검사하는 것을 공부하였다.
하지만 API @RequestBody가 List일때 유효성 검사가 제대로 되지 않는 상황이 발생하였다.

원인

@Valid @RequestBody List<Order> orders
  • @Valid는 하나의 객체를 검증하는데, Collection인 경우 Spring은 Collection객체 자체를 검증하려고 하기 때문에 List를 검증하지 List에 담긴 객체를 검증하진 못한다.

해결방안

Custom Validator

@Component
@RequiredArgsConstructor
public class CustomValidator implements Validator {
    // 검증위해 SpringValidatorAdapter 주입
    private final SpringValidatorAdapter validator;

    // 검증 대상이 List 인지 확인
    @Override
    public boolean supports(Class<?> clazz) {
        return List.class.equals(clazz);
    }
	
	// target을 Collection으로 캐스팅한 뒤 담겨있는 객체를 순회하며, validator를 이용해 검증
    @Override
    public void validate(Object target, Errors errors) {
        for (Object object : (Collection)target) {
            validator.validate(object,errors);
        }
    }
}

custom validator 사용

public ResponseEntity<CommonResponse<Object>> updateFaqCategoryOrder(
            @RequestBody List<Order> orders, Errors errors) {
     customValidator.validate(orders,errors);
     if (!errors.hasErrors()) {
         orderService.updateOrder(orders);
     } else {
         throw new BusinessException(ResponseCode.VALIDATION_ERROR);
     }
     return ResponseEntity.ok().body(new CommonResponse<>(ResponseCode.SUCCESS_UPDATE));
 }

참고

https://gompangs.tistory.com/entry/Spring-Valid-Collection-Validation-관련

https://galid1.tistory.com/719

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글