๐ ์๋ก
์๋ ํ์ธ์ ์ค๋์ 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 |