[DTO 유효성 검증]으로 클라이언트 요청 데이터의 유효성 검증에 실패할 경우에는 아래와 같은 응답 메시지를 확인할 수 있었습니다.

Untitled

Response Body의 내용만으로는 요청 데이터 중에서 어떤 항목이 유효성 검증에 실패했는 지 알 수가 없습니다.

클라이언트 쪽에서 에러메시지를 조금 더 구체적으로 알 수 있도록 바꾸는 작업이 바로 @ExceptionHandler입니다. Spring이 처리하는 에러 응답 메시지를 우리가 직접 처리하도록 코드를 수정할 수 있습니다.

    ...
		...

    @PostMapping
    public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
        Member member = mapper.memberPostDtoToMember(memberDto);

        Member response = memberService.createMember(member);

        return new ResponseEntity<>(mapper.memberToMemberResponseDto(response),
                HttpStatus.CREATED);
    }

		...
		...

@ExceptionHandler
    public ResponseEntity handleException(MethodArgumentNotValidException e) {
        // (1)
        final List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();

        // (2)
        return new ResponseEntity<>(fieldErrors, HttpStatus.BAD_REQUEST);
    }

이제 Postman으로 회원 등록 요청을 전송하면 아래와 같은 결과가 나옵니다.

Untitled

handleException() 메서드에서 유효성 검사 실패에 대한 에러 메시지를 구체적으로 전송해 주기 때문에 클라이언트 입장에서는 이제 어느 곳에 문제가 있는지를 구체적으로 알 수 있게 되었습니다.

하지만 의미를 알 수 없는 정보를 전부 포함한 Response Body 전체 정보를 굳이 다 전달받을 필요는 없이 Request Body의 JSON 프로퍼티 중에서 문제가 된 프로퍼티와 에러 메시지만 전달 받아도 충분합니다.

그러려면 어떻게 해야 할까요?

필요한 에러 정보만 담을 Error Response 클래스를 만든 후 클라이언트 쪽에 전달해주면 됩니다.