본문으로 건너뛰기

NullAway 알아보기

· 약 4분

프로그래밍을 하다보면 대부분의 언어마다 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를 참고할 수 있다.