기본 콘텐츠로 건너뛰기

[ JAVA ] Google Guava 코드에서 @Nonnull, @Nullable, ... 의미

  Collection 관리 등의 이유로 인해서 Google 의 Guava 라이브러리를 참조해서 사용하고 있다. 여러 가지 상황들에 대한 코드 검토 중에 눈에 띄는 코드가 있어서 정리해 둔다.

  @Nullable, @Nonnull 등등의 코드는 액면상으로 보면 뭔가 액션을 취하는 Annotation 코드다. 테스트를 위해서 클래스를 생성하고 해당 코드를 작성하면 "javax.annotation.Nonnull", "javax.annotation.Nullable" 이 필요하지만 찾을 수가 없는 상태다. 무엇이 문제일까?

  상기에서 설명한 Annotation에 대해서 검색을 해 보면 자바 메모리 모델 (Java Memory Model) 과 FindBugs 로 유명한 Bill Pugh 교수팀에서 "JSR 305 - 소프트웨어 결함 탐지" 를 위한 Annotation 시작한 것으로 나온다. 그리고 이를 Google 의 Guava 에서 "google findbug jsr305" 팩키지로 배포 및 소스에서 사용하고 있는 것을 볼 수 있다. 

  실제 해당 Annotation을 코드에서 사용하기 위해서는 아래와 같이 해당 팩키지를 Maven Dependency로 설정해 주어야 사용할 수 있다.

...
<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
    <version>1.3.9</version>
</dependency>
...

  FindBugs 프로젝트에서 이미 Method Parameter 와 Return Type 들에 대해 @Nullable, @NonNull, @CheckForNull 등을 사용했으나 이제는 표준화를 위해서 JSR Spec 쪽에 적용을 하고 있는 것으로 보인다.

  Guava에서 사용하는 Validation 관련 코드는 위에서 설명한 Annotation 들과 "Preconditions" 클래스의 메서드를 활용해서 사용하고 있다. 아래의 샘플은 그 중에 몇 가지를 사용하는 것을 예시한 것이다.

/**
 * 현재 Chain을 생성한 상위 Chain을 반환한다.
 */
public @Nonnull Chain getParent() {
    Preconditions.checkState(parent != null, "현재의 Chain이 최 상위입니다, 상위 Chain이 존재하지 않습니다.");
    return parent;
}

/**
 * 현 Chain의 값을 반환한다. Primitive 형식인 경우는 Object Wrapper 가 반환된다.
 */
public @Nullable Object getValue() {
    return value;
}

이론. 너무 늦게 자바 진영으로 넘어와서 그런지는 모르지만 점점 뭔가를 알아 갈수록 더욱 더 많은 것들을 알아야 하는 이 상황을 어찌할꼬..
(나~ 다시 돌아갈래~~~!!.. ㅋㅋㅋ...  ㅠㅠ)

댓글