# 메서드와 그 자바독 78- /** Whether text would survive sanitising unchanged, for asserting a message is already safe. */ 79: public boolean alreadySafe(String input, int maxLength) { 80- return input != null 81- && !input.isBlank() 82- && sanitize(input, maxLength) 83- .equals(input.trim().toLowerCase(Locale.ROOT).isEmpty() ? REDACTED : input.trim()); 84- } 85-} # 그 이름이 나오는 자리 — 추적 파일 전부, 확장자를 가리지 않는다 src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/error/WebProblemSanitizer.java:79: public boolean alreadySafe(String input, int maxLength) { # 모든 참조에서 그 이름을 건드린 커밋 a24ece9c feat: web, websocket 어댑터 추가 구현 # 그 커밋에서 이 파일의 상태 a24ece9c 2026-08-28 feat: web, websocket 어댑터 추가 구현 A src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/error/WebProblemSanitizer.java # 선행 검사가 쓰는 판정과 삼항이 쓰는 판정 58: if (input == null || input.isBlank()) { 66: working = WHITESPACE.matcher(working).replaceAll(" ").trim(); 73: working = working.substring(0, maxLength).trim(); 81: && !input.isBlank() 83: .equals(input.trim().toLowerCase(Locale.ROOT).isEmpty() ? REDACTED : input.trim()); # 이 리프의 런타임 소속 adapter-inbound-web -> ['app-bootstrap', 'sample-portfolio'] # 이 리프가 선언한 구조 규칙 — 접근 제어자를 가리지 않고 센다 32: public static ArchRule controllersAreUseCaseAdapters() { 51: public static ArchRule controllersDeclareNoTransaction() { 66: public static ArchRule controllerTypesDeclareNoTransaction() { 84: public static ArchRule wireModelsAreNotPersistenceTypes() { 103: public static ArchRule applicationDoesNotSeeTransportTypes() { 122: public static ArchRule noGlobalResponseEnvelope() { 213: public static ArchRule stableDoesNotDependOnAdvanced() { 229: static ArchRule everyControllerIsPublic() { # 그중 실제로 도는 것 — 두 목록에 담긴 것만 돈다 webScopedRules() controllersAreUseCaseAdapters() controllersDeclareNoTransaction() controllerTypesDeclareNoTransaction() wireModelsAreNotPersistenceTypes() noGlobalResponseEnvelope() stableDoesNotDependOnAdvanced() crossLeafRules() applicationDoesNotSeeTransportTypes() 공개 표면 기준선을 적용하는가 : 0