Curl Up Black Cat


๐Ÿ˜Ž ์„œ๋ก  

์•ˆ๋…•ํ•˜์„ธ์š” ์˜ค๋Š˜์€ 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 ์˜ˆ์™ธ


๐Ÿฅธ ๊ฒฐ๋ก 

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๋ฅผ  ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š”๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€์˜ ์›ํ™œํ•œ ์†Œํ†ต๊ณผ ํ˜‘์—…์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋ณด๋‹ค ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œํŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ฉด์„œ ์ด์— ๋Œ€ํ•œ ์—ฐ๊ตฌ์™€ ๊ณ ๋ฏผ์„ ์ง€์†์ ์œผ๋กœ ํ•ด ๋‚˜๊ฐˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.๐Ÿ™‚

 

+ Recent posts