@Nonnull vs @NonNull

Gongmeda·2023년 1월 1일
2
post-thumbnail

이슈

이번에 Spring Batch 로 배치 애플리케이션을 구현하면서 if(kakao) 컨퍼런스 발표에서 소개한 Reader의 성능 개선 방법 중 하나인 ZeroOffsetItemReader 를 사용해보기로 했습니다

이에 대한 구현을 직접하기 보다는 여기에서 소개하는 Jojoldu님께서 동일한 개념으로 구현하신 QuerydslNoOffsetPagingItemReader 를 사용하기로 했습니다

하지만 해당 패키지 dependency를 추가해서 빌드를 해보니 javax.annotation.Nonnull 에 대한 의존성을 못 찾는 이슈를 겪게 되었습니다

@Nonnull 어노테이션의 역할

https://www.javadoc.io/doc/com.google.code.findbugs/jsr305/latest/javax/annotation/Nonnull.html

위 링크의 javadoc 문서에서 소개하는 해당 어노테이션의 기능은 다음과 같습니다

  • annotated된 요소는 null이면 안됨
  • annotated된 필드는 생성된(constructed) 후 null이면 안됨
  • 메소드에 적용될 시 메소드의 반환값에 적용됨

스펙상 위와 같은 역할을 하는 어노테이션이지만, 사실 해당 어노테이션을 붙히는 것 만으로는 아무런 효과가 없습니다

@Test
public void test() {
	method(null); // 문제 없이 통과함
}

private void method(@Nonnull Integer num) {
	System.out.println(num);
}

IDE에서는 해당 어노테이션에 대한 경고를 띄워주기도 합니다

@Nonnull의 문제

javax.annotation.Nonull 는 기본적으로 자바에서 제공되는 스펙이 아닌 어노테이션입니다

따라서, 직접 사용하기 위해서는 별도의 의존성을 추가하여 사용해야 합니다

implementation 'com.google.code.findbugs:jsr305:3.0.2'

@NonNull

@NonNullorg.springframework.lang 패키지에 있는 Spring5 부터 지원하는 어노테이션입니다

내부적으로 javax.annotation.Nonull 어노테이션을 wrapping하고 있는 형태로 구현되어 있으며, Spring 프레임워크에 대한 의존성이 추가되어 있다면 기본적으로 사용할 수 있는 어노테이션 입니다

@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierNickname
public @interface NonNull {
}

Spring 프레임워크를 사용하는 환경에서는 javax.annotation.Nonull 대신 해당 어노테이션을 활용하는 것이 좋아 보입니다

따라서 기존의 javax.annotation.Nonnull 을 모두 org.springframework.lang.NonNull 로 대체하여 의존성 문제를 해결하였습니다

참고

profile
백엔드 깎는 장인

0개의 댓글