JSpecify를 사용한 Spring Null 안전성
Spring 7은 JSpecify 어노테이션을 채택하여 null이 아닌 것을 기본으로 만들고 어노테이션을 줄입니다.
코드 비교
✕ Spring 5/6
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
public class UserService {
@Nullable
public User findById(@NonNull String id) {
return repository.findById(id).orElse(null);
}
@NonNull
public List<User> findAll() {
return repository.findAll();
}
@NonNull
public User save(@NonNull User user) {
return repository.save(user);
}
}
✓ Spring 7
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@NullMarked
public class UserService {
public @Nullable User findById(String id) {
return repository.findById(id).orElse(null);
}
public List<User> findAll() {
return repository.findAll();
}
public User save(User user) {
return repository.save(user);
}
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
기본적으로 non-null
@NullMarked는 어노테이션 없는 모든 타입을 non-null로 만들어 nullable 예외만 어노테이션이 필요합니다.
에코시스템 표준
JSpecify 어노테이션은 NullAway, Error Prone, IDE가 인식하는 크로스 프레임워크 표준입니다.
더 풍부한 도구
모던 정적 분석기는 JSpecify의 null 모델을 이해하고 컴파일 시점에 위반을 보고합니다.
이전 방식
Spring @NonNull/@Nullable
모던 방식
JSpecify @NullMarked
JDK 버전
17
난이도
중급
JDK 지원
JSpecify를 사용한 Spring Null 안전성
사용 가능
Spring Framework 7.0 (Java 17+ 필요) 이후 사용 가능
동작 원리
Spring 5와 6은 org.springframework.lang 패키지에 자체 null 안전성 어노테이션을 도입했습니다. Spring 7은 JSpecify 어노테이션으로 마이그레이션하여 에코시스템 전반의 null 의미론을 표준화합니다.
관련 문서