😎 서론
안녕하세요 오늘은 Spring에서 자주 마주치는 문제 중 하나인 API 잘못된 메시지 요청에 대한 이야기를 해보려고 합니다. 그리고 이를 어떻게 처리했는지 작성해 볼게요.
게시판 프로젝트를 만들어 보면서 백엔드에서 클라이언트로부터 API 요청을 받게 되면, 요청의 JSON 포맷에 오류가 있는 경우가 있었습니다. 그 중에서도 알 수 없는 필드를 전달 받았을 때 이 예외가 발생합니다. 이 문제를 어떻게 해결 할 수 있을까 고민을 했고..
🤔 HttpMessageNotReadableException 처리
Spring 에서 제공하는 @ExceptionHandler 를 사용하여 HttpMessageNotReadableException 을 처리하면서, 그 원인이 되는 cause 를 통해 더 구체적인 예외 상황을 파악하는 방법을 알게되었습니다.
@ExceptionHandler(value = {HttpMessageNotReadableException.class})
public ResponseEntity handleJsonParseException(HttpMessageNotReadableException ex) {
final Throwable cause = ex.getCause();
...
}
이 때, 발견한 것이 UnrecognizedPropertyException 이라는 것입니다. 이 예외는 JSON의 알 수 없는 필드 때문에 발생하므로, 해당 필드의 이름을 얻어와 클라이언트에게 더 구체적인 오류 메시지를 전달하고자 했습니다.
if (cause instanceof UnrecognizedPropertyException) {
final UnrecognizedPropertyException unrecognizedPropertyException = (UnrecognizedPropertyException) cause;
final String fieldName = unrecognizedPropertyException.getPropertyName();
...
}
그리고 이렇게 얻어온 필드 이름을 ErrorCode.UNKNOWN_FIELD 와 함께 반환하여 클라이언트에게 해당 필드가 문제라는 것을 응답하였습니다. 이렇게 처리하면, 클라이언트는 어떤 필드 때문에 요청이 실패했는지 쉽게 파악할 수 있습니다.😀
전체 소스를 보면 아래와 같이 @ExceptionHandler 를 구축해보았습니다.
@ExceptionHandler(value = {HttpMessageNotReadableException.class})
public ResponseEntity handleJsonParseException(HttpMessageNotReadableException ex) {
final Throwable cause = ex.getCause();
if (cause instanceof UnrecognizedPropertyException) {
final UnrecognizedPropertyException unrecognizedPropertyException = (UnrecognizedPropertyException) cause;
final String fieldName = unrecognizedPropertyException.getPropertyName();
final String errorMessage = String.format(ErrorCode.UNKNOWN_FIELD.getMessage() + " : '%s'", fieldName);
final ResponseModel responseModel = ResponseModel.failure(ErrorCode.UNKNOWN_FIELD, errorMessage);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseModel);
}
// 기본 메시지 처리
final ResponseModel responseModel = ResponseModel.failure(ErrorCode.INVALID_JSON, ex.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseModel);
}
그 밖에 JSON 문법 오류 / 타입 불일치 / JSON 구조의 불일치 / 데이터 바인딩 오류가 있는 경우는 기본 메시지 처리로 응답하는 INVALID_JSON 으로 응답하도록 구현하였습니다.
🤠 Response 응답 메시지
구현된 핸들러의 응답메시지는 한번 살펴보겠습니다.🙂
잘못된 필드 데이터 전달이 되었을 경우..
UnrecognizedPropertyException 예외
JSON 문법오류 등 기본 메시지 전달이 되었을 경우..
그 밖의 HttpMessageNotReadableException 예외
🥸 결론
예외 처리는 단순히 오류를 포착하는 것을 넘어 중요한 역할을 하는거 같습니다. 이를 통해 사용자와의 원활한 소통과 협업이 가능하며, 이로 인해 보다 나은 서비스를 제공할 수 있게 됩니다. 게시판 프로젝트를 만들어 보면서 이에 대한 연구와 고민을 지속적으로 해 나갈 계획입니다.🙂
'💻 프로그래밍 > 🆂 Spring' 카테고리의 다른 글
Spring Boot 에서 응답 및 예외 처리 모델 구축하기 (0) | 2023.08.14 |
---|---|
스프링 부트 JSON 응답 Null 값 자동 제거 (0) | 2023.08.14 |
MyBatis XML Mapper 에서 Java 내부 클래스 참조하기 (0) | 2023.08.13 |