작성
·
17
0
안녕하세요, nullable 프라퍼티가 없다면 null를 방어하는 방식에 대해 궁금한 점이 있어 질문남깁니다.
14. Member 도메인 로직 개발
- 생성자에 requireNonNull() 사용
15. 스프링을 이용한 널(null) 안정성 확보
- SpitBugs 플러그인
- package-info 에서 @NonNullApi
이렇게 세가지 방법을 배웠는데요,
SpitBugs 플러그인이
"빌드과정에서 정적 분석을 하여 애노테이션 의미와 부합하지 않으면 에러를 내준다"
라는 말씀에
"그럼 도메인에 Nullable 프라퍼티가 없으면 requireNonNull() 사용 없이 단순히 @NonNullApi + SpotBug만 사용해도 되지 않을까..? "
의문이 들었습니다.
3가지 모두 사용하는게 Null 방어에 괜찮을까요?
아니면 제가 이해한 대로 SpotBug 플러그인 + @NonNullApi 로만 사용해도 충분할까요?
답변 2
0
안녕하세요.
@NonNullApi와 이를 체크하는 SpotBug과 같은 도구는 빌드 과정에서 명시적으로 해당 체크를 요구할 때만 검증을 해줍니다. 만약 SpotBug 체크를 빌드에 추가하지 않으면, 자바 언어의 기본 빌드에서는 이 애노테이션은 아무런 역할을 해주지 못하겠죠. 그래서 직접 null 체크하는 코드를 requireNonNull()을 넣은 것입니다.
Null 값을 잘못 전달하는 상황을 막아주는 것은 런타임에 동작하는 requireNonNull() 입니다. 이게 가장 중요하죠. 자칫 null 값이 DB에 들어가게 되면 이후 여러가지 복잡한 버그가 발생하고 데이터가 망가질 겁니다. 이걸 복구하는 건 꽤나 어려운 작업입니다.
하지만 이렇게 런타임에 안전장치를 해두는 것은 실제 해당 코드가 실행되기 전에는 문제가 있다는 것을 알 수가 없습니다. 서버를 배포하고 2-3일 지나서 처음으로 requireNonNull() 코드가 실행이 된다면, 그때까지 코드의 결함이 있었음에도 확인을 못하고 방치하게 되는 거죠.
그래서 100% 완벽하게 null 문제를 발견해주지는 못하지만(왜냐하면 API 등을 통해서 외부에서 전달되는 값에 의한 null 문제나, 우리가 작상한 코드 외의 라이브러리나 다른 모듈을 통해서 잘못 사용되는 경우도 있으니까요) 그래도 검토 가능한 코드 레벨에서 명백하게 null 값이 들어갈 수 있는 오류가 있다면 미리 체크할 수 있게 하기 위해서 SpotBug 같은 빌드 시점에 동작하는 정적인 체크 기능을 사용해서 결함을 일부라도 미리 발견할 수 있도록 한 것입니다.
이런 정적인 코드 분석을 통한 결함 사전 발견은 IntelliJ 같은 IDE에서도 일부 제공됩니다. 이것도 역시 100% 문제를 다 체크해주지 못하기 때문에 우리가 코드에서 항상 주어진 값을 검증하는 코드를 넣어서 실행시점에서라도 확인이 가능하도록 만드는 것이 필요합니다.
0
안녕하세요, 인프런 AI 인턴입니다. eunseo lay님, 스프링 프레임워크에서의 null 안전성 확보 방법에 대해 질문해 주셨군요.
스프링에서는 여러 방법으로 null 안정성을 확보할 수 있습니다. @NonNullApi는 해당 패키지 내 모든 객체가 기본적으로 null이 아님을 선언하여, 개발자가 의도하지 않는 null 값을 사용할 때 컴파일러 경고를 발생시킵니다. SpotBugs 플러그인은 정적 분석을 통해 null 가능성이 있는 부분을 탐지하고, 이를 개발 단계에서 발견할 수 있도록 도와줍니다.
Objects.requireNonNull(): 코드의 특정 위치에서 명시적으로 null 검사를 수행하여, null 값이 들어올 경우 즉시 예외를 발생시킵니다. 이는 런타임 시에 null 값이 전달되지 않도록 보장하는 방법입니다.
@NonNullApi: 패키지 수준에서 null을 허용하지 않는다는 선언을 통해, 전체 코드베이스에 대한 null 안전성을 강화합니다.
SpotBugs: 코드 빌드 과정에서 정적 분석을 통해 null 관련 잠재적인 오류를 사전에 발견할 수 있도록 합니다.
@NonNullApi와 SpotBugs 플러그인만으로도 많은 경우에 null 안전성을 보장할 수 있습니다. 그러나, 실제 런타임 환경에서 미처 예상하지 못한 외부 데이터나 API 호출 등으로 인해 null이 전달될 수 있는 가능성도 존재합니다. 따라서 Objects.requireNonNull()을 사용하여 중요한 부분에서 명시적인 null 체크를 추가하는 것이 안전성을 높이는 방법이 될 수 있습니다.
즉, 세 가지 방법을 적절히 조합해서 사용하는 것이 가장 안심할 수 있는 방법입니다. 각 방법은 서로 다른 수준의 검증을 제공하며, 서로 보완할 수 있기 때문입니다.
아래의 링크를 참고하시면 더 많은 정보를 얻으실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.