[JAVA] NULL 처리를 잘하자
🔍 null 처리를 잘하자 – 진짜 실수는 예외가 아니다
최근.. 회사에서 NULL 처리가 안되서 오류나는 사건들이 속출하고 있다.
진짜 기본적인건데 생각하기 어렵기 때문에 오늘도 다짐을 하고 가본다..
☠️ null은 조용히, 하지만 확실하게 망친다
개발하면서 가장 흔하게 마주치는 오류 중 하나가 바로 NullPointerException(NPE)입니다. 특히 Java 개발자라면 null 체크는 거의 반사적으로 하게 되는 루틴이죠. 그런데, 언제부턴가 이게 "습관"이 되어버린 건 아닌지 한번 돌아보게 되더군요.
그냥 if (obj != null)로 막기만 한다고 해서 진짜 null 처리를 잘하고 있는 걸까요?
✅ null 처리를 잘 한다는 건?
null 처리를 “잘 한다”는 건 단순히 예외를 회피하는 것이 아닙니다. 다음과 같은 관점을 함께 고려해야 합니다.
1. null이 생기는 이유부터 파악하기
null은 "값이 없다"는 의미이기도 하지만, 그건 비즈니스적으로 정말 의미가 없는 값일 때만 사용해야 합니다.
불확실하거나, 아직 세팅되지 않았거나, 뭔가 누락된 상태에서 null을 남발하면 시스템 전반이 불안정해집니다.
✨ TIP: 반환 타입을 Optional로 감싸면 명시적으로 “이건 null일 수도 있어요”라고 선언할 수 있어서 오해를 줄일 수 있습니다.
2. 초기화는 일찍, 명확하게
클래스를 설계할 때 null을 허용하지 않는 방향으로 생각해보세요.
초기값을 미리 세팅하거나, 생성자에서 필수값을 모두 넣도록 강제하는 것만으로도 NPE를 상당히 줄일 수 있습니다.
// 나쁜 예 User user = null; // 좋은 예 User user = new User("홍길동");
3. null 체크는 깊게 하지 말고, 빠르게 리턴하자
계속 중첩되는 null 체크는 코드도 보기 어렵고, 디버깅도 힘들어집니다. 이럴 때는 조기 반환(Early Return) 패턴이 훨씬 읽기 쉽습니다.
// 안 좋은 코드
if(user != null) { if(user.getAddress() != null) { if(user.getAddress().getCity() != null) { ... } } }
// 좋은 코드
if(user == null || user.getAddress() == null || user.getAddress().getCity() == null) { return; }
또는 Java 8 이상이면 Optional을 활용해 깔끔하게도 가능하죠.
4. 프레임워크와 도구를 믿자
Spring에서는 @NotNull, @Valid 등의 어노테이션을 통해 검증을 미리 수행할 수 있고,
IDE에서는 Nullable, NotNull 등의 힌트를 통해 코드 안전성을 높일 수 있습니다.
✍️ 실수는 줄이고, 의도는 명확하게
우리가 null 처리를 잘해야 하는 이유는 단순히 예외를 막기 위해서가 아니라,
코드의 의도와 흐름을 명확하게 하기 위해서입니다.
null은 방치하면 오류의 씨앗이 되지만, 잘 관리하면 안정적인 시스템의 기초가 됩니다.
💬 마무리하며…
여러분의 프로젝트에서는 null을 어떻게 다루고 계신가요?
혹시 '일단 막고 보자' 식의 방어적 코드만 쌓이고 있는 건 아닌가요?
null을 두려워하지 말고, 관리하세요.
null은 실수가 아니라, 우리가 더 잘 설계할 수 있도록 알려주는 신호일 수도 있습니다.