Application Servers & Java

NumberFormatException: For input string – 입력값 파싱 실패

midworker 2025. 5. 19. 22:25
반응형

WebLogic 환경에서 JSP 실행 중 다음과 같은 예외가 발생했습니다.


에러 로그

Root cause of ServletException.
java.lang.NumberFormatException: For input string: "[입력오류]"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:447)
    at java.lang.Integer.parseInt(Integer.java:497)
    at jsp_servlet._at_workstate._ws_reward._list.__list._jspService(__list.java:1103)
    ...

원인 분석

이 예외는 Java의 Integer.parseInt(String) 메서드가 정수로 변환할 수 없는 문자열을 입력받았을 때 발생합니다.

주요 원인:

  • 사용자가 웹 요청 파라미터로 정수가 아닌 값을 전송
  • null 또는 빈 문자열이 넘어옴에도 검증 없이 parseInt() 호출
  • 입력값 필터링/검증 로직이 부족하거나 누락됨

예를 들어, 다음과 같은 코드에서:

<%
int rewardId = Integer.parseInt(request.getParameter("rewardId"));
%>

rewardId=abc 혹은 rewardId=가 넘어오면 위와 같은 에러가 발생합니다.


해결 방법

1. 입력값 검증 추가

정수로 변환 가능한지 먼저 체크한 후 parseInt를 호출하도록 수정합니다.

String rewardIdStr = request.getParameter("rewardId");

int rewardId = 0;
if (rewardIdStr != null && rewardIdStr.matches("\\d+")) {
    rewardId = Integer.parseInt(rewardIdStr);
} else {
    // 예외 처리 또는 기본값 적용
    log.warn("Invalid rewardId input: " + rewardIdStr);
}

2. 예외 처리 보완

사용자에게 친절한 메시지를 제공하거나, 서버 로그에만 기록하고 흐름을 유지하는 방식도 고려합니다.

<%
try {
    int rewardId = Integer.parseInt(request.getParameter("rewardId"));
    // 로직 처리
} catch (NumberFormatException e) {
    out.println("잘못된 입력입니다. 숫자만 입력해 주세요.");
    log.error("Invalid number format in rewardId", e);
}
%>

3. 입력 파라미터 단위 테스트

  • QA 단계에서 각 파라미터에 대해 유효값/무효값 테스트 케이스를 구성하여 반복 발생을 줄일 수 있습니다.

결론

NumberFormatException은 자주 발생하는 입력 파싱 오류이지만, 간단한 검증 절차만으로도 충분히 방지할 수 있습니다.
입력값은 항상 신뢰하지 말고, 사전 체크 및 예외 처리를 통해 시스템의 안정성을 높여야 합니다.


반응형