1) 설계단계 - 패키지 레벨 @NonNull
@NonNullApi
package dev.es.myasset.domain;
import org.springframework.lang.NonNullApi;
해당 패키지 안에서는 "기본적으로 Null을 안쓴다" 선언
- 메서드 파라미터 / 반환값에 대해 의도적으로 명시
- 설계 규칙 & 문서 역할을 한다
- 규칙을 코드에 적어두는 것이므로 이 자체로만으론 규칙을 지키게 만드는 힘은 없다.
2) 빌드단계 - SpotBugs
plugins {
id("com.github.spotbugs") version "6.4.8"
}
- @NonNull @ Nullable 기반으로 코드를 분석해 계약 규칙 위반을 호출한다.
- 빌드단계에서 규칙 위반을 실패로 만든다
3) 런타임 단계 - Objects.requireNonNull()
@Builder
public UserInfo(String username, Enum<ProviderType> providerType, String email) {
this.username = Objects.requireNonNull(username, "username cannot be null");
this.providerType = Objects.requireNonNull(providerType, "providerType cannot be null");
this.email = Objects.requireNonNull(email, "email cannot be null");
}
- 실행시점에 NonNull을 100% 보장
- 실행되지 전까지는 모르므로 requireNonNull만으로는 배포 전 모두 방어가 사실상 불가
'JAVA > SPRING' 카테고리의 다른 글
| @MapsId : Derived Identifier (1) | 2025.12.22 |
|---|---|
| record class(JAVA)와 data class(Kotlin) 비교 (0) | 2025.12.19 |
| JPA 영속성(Persistence) 기초 정리 (1) | 2025.11.25 |
| 파일 업로드 (0) | 2025.11.23 |
| Type Converter, Formatter (0) | 2025.11.22 |