반응형
1. 개요
NullPointerException(NPE)은 null인 객체를 참조하려고 할 때 발생하는 런타임 예외다.
자바에서 가장 많이 터지는 에러고, 대부분은 “기본적인 체크 누락”에서 나온다.
2. 대표 발생 케이스
1) 객체 초기화 누락
User user = null;
user.getName(); // NPE
서비스/DAO에서 객체 못 받아왔을 때 자주 발생
2) 메서드 리턴값이 null
User user = userService.findById(id);
user.getName(); // user가 null이면 터짐
DB 조회 결과 없음 / Optional 안 씀
3) 컬렉션 값 null
List<User> list = null;
list.size(); // NPE
초기화 안 된 리스트, 조건 분기 누락
4) Map에서 key 없음
map.get("key").toString(); // 값 없으면 null → NPE
실무에서 은근 많이 터짐
5) 의존성 주입 실패 (Spring)
@Autowired
private UserService userService;
Bean 등록 안 됐거나, 수동 생성(new)하면 null
6) 문자열 비교 실수
String str = null;
str.equals("test"); // NPE
항상 상수를 앞으로:
3. 실무에서 많이 터지는 위치
- Controller → Service 호출 시
- Service → DAO 결과 받을 때
- 외부 API 응답 처리할 때
- JSON 파싱 후 값 꺼낼 때
특히 “정상 케이스만 가정하고 코드 짤 때” 터진다
4. 해결 방법 (실무 기준)
1) null 체크 (기본)
if (user != null) {
user.getName();
}
2) Optional 사용
Optional<User> user = userService.findById(id);
user.ifPresent(u -> u.getName());
3) 기본값 처리
String name = (user != null) ? user.getName() : "";
4) 컬렉션 초기화 습관
List<User> list = new ArrayList<>();
5) 방어 코드 (가장 중요)
if (user == null) {
throw new IllegalArgumentException("user is null");
}
초기에 터뜨리는 게 디버깅 훨씬 빠름
5. 디버깅 방법
1) 로그로 값 확인
log.info("user: {}", user);
2) 에러 라인 정확히 보기
스택 트레이스에서:
NullPointerException at UserService.java:45
3) 단계별 확인
- 어디서 null 들어왔는지 역추적
- Controller → Service → DAO 순으로 체크
6. 실무 팁
- “절대 null 안 온다” → 100% 틀림
- 외부 데이터는 무조건 null 가능성 있음
- Optional 남발도 좋지 않지만, 조회 결과에는 유용
7. 정리
- NPE는 대부분 초기화/검증 누락
- 방어 코드 + 습관으로 충분히 줄일 수 있음
- 중요한 건 “안 터지게”가 아니라 “빨리 찾게 만드는 것”
반응형
'백엔드 개발' 카테고리의 다른 글
| Spring 동시성 문제 해결 (synchronized부터 Redis Lock, Lua, Redisson까지 정리) (0) | 2026.04.06 |
|---|---|
| 로컬 캐시(Local Cache), 언제 쓰고 어떻게 써야 할까? (Spring + Caffeine 정리) (0) | 2026.04.01 |
| Spring Boot + SAP JCo 연동 SDK 만들기 (Builder 패턴 적용) (0) | 2026.03.27 |
| Spring Boot Redis 실무 활용: 클러스터/싱글 + 동기/비동기 + TTL + LocalDateTime (0) | 2026.02.13 |
| Builder 패턴으로 SDK 모듈 래핑하기 (실무 적용 사례) (0) | 2026.02.09 |