From cc6542c7ed1d9386cc341bf1289588b28d627206 Mon Sep 17 00:00:00 2001 From: itms-merge-dev Date: Mon, 20 Jul 2026 00:48:19 +0900 Subject: [PATCH] =?UTF-8?q?fix(itms-front):=20api=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EB=B0=A9=EC=96=B4=EC=A0=81=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1=20=E2=80=94=20trace/message/error=20=EC=98=B5?= =?UTF-8?q?=EC=85=94=EB=84=90=ED=99=94=20(=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=C2=B7=EB=A9=94=EB=89=B4=20=EB=B6=95=EA=B4=B4=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RestApiCallUtil 이 api 에러 응답에서 JSONObject.get("trace")/get("error")/get("message")를 무조건 읽어 필드 부재 시 kong.unirest JSONException → RuntimeException → /error-page/501.do → 페이지 전체(헤더/좌측메뉴 포함) 렌더 붕괴. optString/optInt 로 방어화(정상 파싱 유지, 부재 시 폴백). 검증: 재빌드·배포 후 로그인→메인 200, 좌측메뉴 데이터 렌더, 외부 200 회귀. Co-Authored-By: Claude Fable 5 --- .../common/util/RestApiCallUtil.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/front/src/main/java/com/urpsys/basefront/common/util/RestApiCallUtil.java b/front/src/main/java/com/urpsys/basefront/common/util/RestApiCallUtil.java index 1099fd35..d8850663 100644 --- a/front/src/main/java/com/urpsys/basefront/common/util/RestApiCallUtil.java +++ b/front/src/main/java/com/urpsys/basefront/common/util/RestApiCallUtil.java @@ -152,25 +152,25 @@ public class RestApiCallUtil // Map 변환처리 Map returnMap = null; - // 비정상처리 + // 비정상처리 if(strFullReturnData.indexOf("status")<0) { - String strError = (String)returnObj.get("error"); - String strMessage = (String)returnObj.get("message"); - + // 2026-07-20 방어적 파싱: 필드 부재 시 예외(JSONException) 대신 안전 기본값 → 페이지 전체 붕괴 방지 + String strMessage = returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다.")); + throw new CustomException("9000", strMessage); } - // 정상처리 + // 정상처리 else { // log.info("한번 봅시다 2. => [{}]", returnObj.get("status")); - int iReturnStatus = (int)returnObj.get("status"); - + int iReturnStatus = returnObj.optInt("status", 200); + if(iReturnStatus != 200) { - String strError = (String)returnObj.get("error"); - String strErrTrace = (String)returnObj.get("trace"); - + // 2026-07-20 trace 옵셔널: 없으면 message/error 로 폴백(kong.unirest get() 은 키부재 시 예외) + String strErrTrace = returnObj.optString("trace", returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다."))); + throw new CustomException("9000", strErrTrace); } else @@ -223,13 +223,13 @@ public class RestApiCallUtil JSONObject returnObj = jsonResponse.getBody().getObject(); JSONObject returnObjData = new JSONObject(); - int iReturnStatus = (int)returnObj.get("status"); - + int iReturnStatus = returnObj.optInt("status", 200); + if(iReturnStatus != 200) { - String strError = (String)returnObj.get("error"); - String strErrTrace = (String)returnObj.get("trace"); - + // 2026-07-20 방어적 파싱: trace 부재 시 message/error 폴백(예외→501 붕괴 방지) + String strErrTrace = returnObj.optString("trace", returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다."))); + throw new CustomException("9000", strErrTrace); } else