NullAway 알아보기
프로그래밍을 하다보면 대부분의 언어마다 null
이라는 값이 존재한다. 때로는 이 존재가 문제를 야기시키기도 하는데 자바에서는 null
인 객체를 참조하게 되면 NullPointException
이라는 런타임 에러를 던지게 된다.
String message = "Hello Would!";
message = null;
message.toLowerCase(); // throw NullPointException
물론, 위와 같은 코드를 작성하진 않겠지만 상황에 따라서 휴먼 에러는 언제나 발생할 수 있고 발견하기 어려울 수 있다.
널 레퍼런스를 처음 만든 토니 호어가 '10억 불짜리 실수'(billion dollar mistake)였다고 회고한 적 있다. - 나무위키 中
테스트 코드를 만들면 이를 방지할 수 있겠지만 근본적으로 해결할 수 없는(?) 문제이기 때문에 관련 프레임워크나 대체 언어(ex. kotlin
)가 나오고 있다. 그 중 uber에서 만든 NullAway
를 알아보자.
NullAway
애노테이션 기반이다. (@Nullable
, @NonNull
등)
자바의 대표적인 프레임워크인 Spring을 보면 @Nullable
가 필드나 파라미터, 반환값 등에 붙은 것을 볼 수 있는데, js-305에서 제공하는 메타 에노테이션들 중 하나이다.
※ js-305: 자바 소프트웨어 오류 발견 도구를 위한 표준
error-prone
이 내장되어 있다.
error-prone은 구글에서 만든 정적 분석 툴로 프로그래밍에서 흔히 하기 쉬운 패턴을 찾아 알려준다. 해당 패턴은 공식문서에서 찾아볼 수 있고, 커스텀하게 추가할 수도 있다. 잠깐 훑어봤는데 이를 참고하여 자신의 잘못된 프로그래밍도 개선될 수 있지 않을까 싶다.
그 외
- 모든 NPE를 방어하지 못한다. (어찌보면 당연한거겠지만...)
- 빌드 시간이 더 걸린다. (문서상으로 최대 10% 미만이라고 하니 크게 무리 없지 않을까 싶다.)
초간단 샘플
간단히 문자열을 소문자로 만들어주는 메소드가 있다고 가정하자.
private static String foo(String bar) {
return bar.toLowerCase();
}
본의 아니게 파라미터에 null
을 넣는다면 컴파일 과정에서 다음과 같은 에러 메시지가 출력된다.
System.out.println(foo(null));
// error: [NullAway] passing @Nullable parameter 'null' where @NonNull is required
설정이나 샘플 코드는 공식 문서나 JavaBasePractice - NullAway를 참고할 수 있다.