Spring Null-Safety 주석

1. 개요

Spring 5부터는 이제 더 안전한 코드를 작성하는 데 도움이되는 흥미로운 기능에 액세스 할 수 있습니다. 이 기능을 null-safety라고하며 잠재적 인 null 참조를 감시하는 보호 장치처럼 작동하는 주석 그룹입니다.

안전하지 않은 코드에서 벗어나게하는 대신 null-safety 기능은 컴파일 타임에 경고를 생성합니다. 이러한 경고는 런타임에 치명적인 NPE (널 포인터 예외)를 방지 할 수 있습니다.

2. @NonNull 주석

@NonNull의 주석은 널 안전 기능의 주석 모든 중 가장 중요하다. 이 주석 t0은 객체 참조가 예상 되는 필드, 메서드 매개 변수 또는 메서드의 반환 값 과 같이 null이 아닌 제약 조건을 선언 할 수 있습니다 .

Person 이라는 클래스가 있다고 가정합니다 .

public class Person { private String fullName; void setFullName(String fullName) { if (fullName != null && fullName.isEmpty()) { fullName = null; } this.fullName = fullName; } // getter }

이 클래스 정의는 유효하지만 결함 이 있습니다 . fullName 필드가 null 로 설정 될 수 있습니다 . 이런 일이 발생하면 fullName으로 작업 할 때 NPE로 끝날 수 있습니다.

Spring null-safety 기능을 사용하면 도구가 이러한 위험을보고 할 수 있습니다. 예를 들어 IntelliJ IDEA로 코드를 작성 하고 @NonNull 주석으로 fullName 필드를 장식하면 경고가 표시됩니다.

이 표시 덕분에 우리는 문제를 미리 인식하고 런타임 오류를 방지하기 위해 적절한 조치를 취할 수 있습니다.

3. @NonNullFields 주석

@NonNull 주석은 널 안전 보장에 도움이됩니다. 그러나이 주석으로 null이 아닌 모든 필드를 장식하면 전체 코드베이스를 오염시킬 수 있습니다.

우리의 남용 방지 할 수 있습니다 @NonNull 다른 주석과를 - @NonNullFields을 . 이 주석은 패키지 수준에서 적용 할 수 있으며 주석이 달린 패키지의 모든 필드가 기본적으로 null이 아님을 개발 도구에 알립니다.

를 들어 @NonNullFields의 주석이 킥, 우리라는 이름의 파일을 생성 할 필요가 package-info.java 패키지의 루트 디렉토리에와 함께 패키지 주석 @NonNullFields를 :

@NonNullFields package org.baeldung.nullibility;

Person 클래스에서 nickName 이라는 다른 속성을 선언 해 보겠습니다 .

package org.baeldung.nullibility; // import statements public class Person { private String nickName; void setNickName(@Nullable String nickName) { if (nickName != null && nickName.isEmpty()) { nickName = null; } this.nickName = nickName; } // other declarations }

이번에 는 @NonNull로 nickName 필드를 장식하지 않지만 여전히 유사한 경고가 표시됩니다.

@NonNullFields의 주석는 안전 동일한 수준의 보장하면서 자세한 적은 우리의 코드를 만드는 @NonNull을 제공합니다.

4. @Nullable 주석

@NonNullFields의 주석은 일반적으로 바람직하다 @NonNull 은 보일러를 줄일 수있다. 때때로 우리는 패키지 수준에서 지정된 null이 아닌 제약 조건에서 일부 필드를 제외하려고합니다.

nickName 필드 로 돌아가서 @Nullable 주석으로 장식 해 보겠습니다 .

@Nullable private String nickName;

이전에 보았던 경고는 이제 사라졌습니다.

이 상황에서 필드 에서 @NonNullFields 의 의미를 재정의 하기 위해 @Nullable 주석을 사용했습니다 .

5. @NonNullApi 주석

@NonNullFields의 이름에서 알 수 있듯이 주석 만에 필드에 적용됩니다. 메서드의 매개 변수와 반환 값에 동일한 영향을 미치려면 @NonNullApi 가 필요 합니다 .

@NonNullFields 와 마찬가지로 package-info.java 파일 에 @NonNullApi 주석을 지정해야 합니다.

@NonNullApi package org.baeldung.nullibility;

nickName 필드에 대한 getter를 정의 해 보겠습니다 .

package org.baeldung.nullibility; // import statements public class Person { @Nullable private String nickName; String getNickName() { return nickName; } // other declarations }

으로 @NonNullApi의 효과 주석 경고가 가능한 대해 발행 에 의해 생성 된 값 getNickName에 있어서

다만 같은 공지 @NonNullFields의 주석, 우리가 무시할 수 있습니다 @NonNullApi을 와 방법 레벨에서 @Nullable 주석.

6. 결론

Spring null-safety는 NPE의 가능성을 줄이는 데 도움이되는 훌륭한 기능입니다. 그러나이 기능을 사용하는 동안주의해야 할 두 가지 중요한 사항이 있습니다.

  • IntelliJ IDEA와 같은 지원 개발 도구에서만 사용할 수 있습니다.
  • 런타임에 null 검사를 시행하지 않습니다. NPE를 방지하려면 여전히 코드를 직접 작성해야합니다.

이 튜토리얼의 소스 코드는 GitHub에서 찾을 수 있습니다.