invalid_visibility_annotation — public이 아닌 멤버에 붙은 가시성 어노테이션
invalid_visibility_annotation — public이 아닌 멤버에 붙은 가시성 어노테이션
visibleForTemplate이나 visibleForTesting 어노테이션이 private(비공개) 멤버에 적용될 때 나타나는 진단이에요. 이 어노테이션들이 왜 public 멤버에만 의미가 있는지, 어떻게 고치는지 살펴볼게요.
본문
분석기는 visibleForTemplate 또는 visibleForTesting 어노테이션이 public이 아닌 선언에 적용될 때 이 진단을 내보내요.
private 멤버(예: _로 시작하는 멤버)는 원래부터 선언된 라이브러리 밖에서 참조할 수 없어요. 그런데 이 어노테이션들은 "다른 곳에서도 쓰일 수 있게 하되 특정 상황으로 제한한다"는 의미예요. 이미 밖에서 접근이 막힌 멤버에 이런 제한을 걸어봐야 아무 효과가 없으니, 의미가 없는 거죠.
예시
아래 코드가 이 진단을 만들어내요.
import 'package:meta/meta.dart';
@visibleForTesting
void _someFunction() {}
void f() => _someFunction();
_someFunction은 _로 시작해서 private이에요. 그런데 여기에 @visibleForTesting을 붙이니 "이미 테스트에서도 쓸 수 없는 멤버를 테스트 전용으로 표시"하는 모순이 생기는 거예요.
흔한 해결 방법
만약 이 선언이 테스트 코드에서 사용될 필요가 없다면, 어노테이션을 제거하면 돼요.
void _someFunction() {}
void f() => _someFunction();
반대로 테스트 코드에서 사용해야 한다면, 멤버를 public으로 바꿔 주면 돼요. _를 떼는 것만으로도 충분해요.
import 'package:meta/meta.dart';
@visibleForTesting
void someFunction() {}
void f() => someFunction();
여기서는 _someFunction을 someFunction으로 바꿔 public으로 만들고, @visibleForTesting을 그대로 유지했어요. 이제 테스트 외의 일반 코드에서는 막히고, 테스트 코드에서는 쓸 수 있게 된 거예요.
더 알아보기
visibleForTesting어노테이션에 대한 자세한 내용은package:meta문서를 참고하세요.- Dart의 private/public 구분은 라이브러리 단위로 이뤄진다는 점(언더스코어
_규칙)도 Dart 언어 투어 — 라이브러리 문서에서 함께 확인하면 좋아요.