언어/JAVA

[Java] 현업 자바 백엔드 개발자들이 가장 많이 하는 실수 1위: NullPointerException(NPE) 방어 미흡

zumsim 2025. 11. 19. 21:50
728x90
반응형

Java 백엔드 개발을 하다 보면 가장 자주 맞닥뜨리는 예외가 바로 NullPointerException(NPE)입니다.
이 예외는 신입부터 10년차까지 누구나 꼭 경험하고, 심지어 현업에서도 반복적으로 발생하는 대표적인 오류입니다.

특히 Spring + MyBatis + JSP + Oracle/Tibero 기반의 레거시 환경에서는 “값이 null인지 아닌지” 체크만 제대로 해도 수많은 장애를 예방할 수 있습니다.


1️⃣ 왜 항상 NullPointerException이 발생할까?

Java는 null을 허용하는 언어입니다.
이 말은 곧, 객체가 아닌데도 객체처럼 다루는 순간 바로 NPE가 발생한다는 뜻이죠.


2️⃣ 실무에서 가장 흔한 NPE 패턴

① toString(), length() 같은 메서드를 바로 호출

String name = param.get("name").toString();  // ❌ name이 null이면 바로 NPE

해결

String name = param.get("name") == null ? "" : param.get("name").toString();

또는

String name = Objects.toString(param.get("name"), "");

 

② selectOne(), get() 등이 null을 반환하는데 바로 사용

int cnt = dao.selectCount(param);  // null이면 바로 NPE

해결

Integer cnt = dao.selectCount(param);
int safeCnt = (cnt == null ? 0 : cnt);

 

③ request 파라미터가 "" (빈 문자열)인데 숫자로 변환

int year = Integer.parseInt(request.getParameter("year"));  // ❌ 빈 문자열이면 NumberFormatException

NPE는 아니지만, NPE와 세트로 터지는 대표적인 실수입니다.

 

④ sessionScope 값이 없을 때 그대로 로직 태우는 문제

var grade = "${sessionScope.s_schul_grd_cd}";
if (grade) {
    // grade가 빈 문자열이어도 true로 인식해버림 (JS)
}

프론트에서 null/빈 문자열 체크가 잘못되어 백엔드 로직까지 꼬이는 대표적인 사례입니다.

 

⑤ DTO, JSON, Map 내부 값이 null인데 체이닝으로 호출

student.getAddress().getZipCode().length();  // ❌ 중간에 null 있으면 바로 NPE

3️⃣ 실무에서 NPE를 줄이는 방법

✔ Objects.toString(), Optional 적극 활용

String name = Objects.toString(param.get("name"), "");

✔ DTO 생성 시 기본값 초기화

생성자에서 null 가능성 자체를 줄이면 안전합니다.

✔ MyBatis resultMap 적극 사용

타입 매핑 오류로 인한 null 문제를 줄일 수 있습니다.

✔ Map 기반 파라미터 defensive coding

String value = (String) map.getOrDefault("key", "");

✔ API 요청에서 필수값/옵션값 구분

요청 스펙을 명확히 해야 백엔드가 null 값에 흔들리지 않습니다.

✔ null 가능성이 있는 값은 로그로 명확하게 출력

log.debug("param.name = {}", param.get("name"));

4️⃣ NPE를 방치하면 생기는 문제

  • 500 서버 오류 발생
  • 특정 사용자만 오류 발생 → 재현 어려움
  • 배포 후 장애 가능성 증가
  • CI/CD에서 테스트 실패
  • 대규모 트래픽에선 즉시 장애로 확산

NPE는 사소한 오류가 아니라, 실무에서 장애의 근본 원인 중 하나입니다.


5️⃣ 마무리

NullPointerException은 자바 개발자라면 누구나 겪는 오류지만, 조금만 습관을 들이면 대폭 줄일 수 있습니다.

  • null 가능성 항상 의식하기
  • 파라미터 안전하게 파싱
  • DTO/Map 기본값 처리
  • Optional/Objects 적극 활용

이 네 가지만 지켜도 NPE 때문에 야근할 일은 크게 줄어듭니다.


 

728x90
반응형