[Spring] @Valid 예외처리[MethodArgumentNotValidException]

조성현·2023년 1월 7일
1

한줄요약
좌충우돌 @Vaild 예외처리 (feat. MethodArgumentNotValidException)

사건의 발단

  • 회원가입시 입력값에 제한을 두고자 DTO에 조건을 달아주고,
  • Controller에 @Valid 를 달아주었다.

잘못 입력하면 어떻게 되려나~ 하는 마음으로 테스트를 해봤고?
-> 끝없는 trace를 만날 수 있었다.

{
    "timestamp": "2023-01-07T13:13:10.899+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] "
    // trace는 필요한 부분만 잘랐습니다. 나머지는 프로젝트 경로임. 
    "message": "Validation failed for object='registerRequestDto'. Error count: 1",
    "errors": [
        {
            "codes": [
                "Pattern.registerRequestDto.username",
                "Pattern.username",
                "Pattern.java.lang.String",
                "Pattern"
            ],
            "arguments": [
                {
                    "codes": [
                        "registerRequestDto.username",
                        "username"
                    ],
                    "arguments": null,
                    "defaultMessage": "username",
                    "code": "username"
                },
                [],
                {
                    "arguments": null,
                    "defaultMessage": "^[a-z0-9]*$",
                    "codes": [
                        "^[a-z0-9]*$"
                    ]
                }
            ],
            "defaultMessage": "\"^[a-z0-9]*$\"와 일치해야 합니다",
            "objectName": "registerRequestDto",
            "field": "username",
            "rejectedValue": "sh123ㅁ",
            "bindingFailure": false,
            "code": "Pattern"
        }
    ],
    "path": "/api/members/register"
}

@Valid 핸들링

"trace": "org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] "
사실 trace는 우리에게 힌트를 주는 좋은 친구... 일지도?

MethodArgumentNotValidException handling

@ExceptionHandler({MethodArgumentNotValidException.class})
protected ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    return new ResponseEntity<>(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage() ,HttpStatus.BAD_REQUEST);
}

아... PatterndefaultMessage가 썩 마음에 들지 않는다...!
-> @Pattern에서 message를 설정해주었다.

행복 그잡채...!
: )

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

0개의 댓글