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
반응형
'언어 > JAVA' 카테고리의 다른 글
| 🔍 Java split(",", -1) — 마지막 콤마 때문에 삽질했던 사람들에게 (0) | 2025.11.08 |
|---|---|
| request.getRemoteAddr()로 정확한 IP 추출이 되지 않을 때.. (0) | 2023.05.11 |
| 에라토스테네스의 체 (0) | 2022.11.15 |
| 배열 복사 : clone() 과 arraycopy() (0) | 2022.11.09 |
| JAVA 엑셀다운로드시 파일명 한글 오류 (0) | 2022.11.08 |