
지나치기 쉬운 NullPointerException을 도메인 주도 설계와 AI 에이전트 자동화 지침으로 영원히 박멸하는 방법
행복한 연차 날 아침을 깨운 쿠폰 복원 장애의 주범인 NPE(NullPointerException)를 분석하고, 이를 설계적 개선과 팀의 자동화 시스템으로 승화시킨 생생한 경험담입니다. 단순한 방어적 null 체크를 넘어 Optional, 값 객체(Value Object), 시스템 경계에서의 처리를 통해 구조적 null 안전성을 확보하는 설계 원칙을 제시합니다. 나아가 AI 에이전트인 Claude Code의 행동 지침에 장애 사례를 이식하여 사람이 개입하지 않아도 시스템이 스스로 NPE를 검증하고 예방하는 개발 파이프라인의 미래를 보여줍니다.
자바/스프링 환경에서 반복되는 NPE 장애로 골머리를 앓는 백엔드 개발자나, 회고 후에도 자꾸만 재발하는 휴먼 에러를 시스템 및 AI 자동화로 근본적으로 해결하고 싶은 개발 팀에게 강력히 추천합니다.
쿠폰 복원 로직 리팩토링 과정에서 예산 제한 여부를 체크하는 조건문 울타리가 사라져, 일반 쿠폰 처리 시 null 데이터가 유틸리티 함수로 유입되어 운영 환경에서 NullPointerException(NPE)이 발생하였습니다. 이는 전통적인 컴파일러 검증, 테스트 커버리지, 단순 코드 리뷰만으로는 잡아내기 어려웠던 엣지 케이스였습니다.
Null 가능성을 단순 플래그가 아닌 Optional 타입 및 도메인 객체(값 객체)로 승격하여 컴파일 단계에서 검증을 강제하고, 시스템 경계(Mapper)에서 null을 사전 정리하도록 설계를 개선했다. 또한, 분석된 장애 패턴을 Claude Code 기반의 AI 에이전트 행동 지침(implementer.md)에 체크리스트로 자동화 등록하여 시스템적으로 재발을 방지하는 방어 체계를 구축했다.
리팩토링 이후 설계 관점에서는 null 체크 누락 실수가 원천 차단되었으며, AI 에이전트가 코드를 작성하는 과정에서 스스로 null 가드 코드를 보강하고 NPE를 사전에 탐지하여 테스트를 통과시키는 자동화된 방어 체계를 구축하는 성과를 거두었다.
Trade-off
도메인 객체와 Optional을 적극 도입함으로써 코드의 안전성과 응집도는 높아졌으나, JPA 엔티티 필드와 같이 프레임워크 제약상 Optional을 직접 사용하지 못하는 영역이 존재하여 @Nullable 어노테이션을 통한 정적 분석에 의존해야 하는 한계가 존재하며, 도메인 객체 및 값 객체(VO)의 개수가 늘어나 구조적 복잡도가 다소 증가할 수 있습니다.
도메인 주도 설계(DDD)에서 비즈니스 개념을 나타내는 불변 객체로, 단순히 데이터만 담는 것이 아니라 관련된 비즈니스 유효성 검증 및 로직을 스스로 수행하여 책임의 응집도를 높입니다.
Java 8에 도입된 래퍼 클래스로, null이 존재할 수 있음을 타입 시스템을 통해 명시적으로 나타내어 호출자가 반드시 null 가능성을 의식하고 처리하도록 강제합니다.
개발 지침(SSOT)을 기반으로 기획, 테스트 작성, 구현, 코드 리뷰 등의 소프트웨어 개발 수명 주기(SDLC)를 자동 수행하는 AI 기반 워크플로우 엔진입니다.









