이미 위 메서드는 유효성 검사를 일부 수행하고 있습니다. 불행히도 두 가지 심각한 문제를 안고 있지만요.
먼저 위 메서드는 null 참조를 올바르게 확인하지 않습니다. location이 null이면 Files.isDirectory()는 별다른 설명 없이 NullPointerException과 함께 실패합니다. message가 null이면 message.equals("")를 먼저 확인하니 두 번째 조건문에서도 마찬가지입니다.
인수를 검증할 때는 순서가 중요한데 반드시 null을 먼저 확인한 후 도메인에 따라 “유효하지 않은” 값을 검사해야 합니다. 빈 문자열이나 빈 리스트처럼 일반적인 기본값을 먼저 검사한 후 특정 값을 확인하는 것이 좋습니다.
메서드 인수로 null을 전달하는 방식은 메서드가 매개변수 없이도 올바르게 기능한다는 뜻이니 피해야 합니다. 꼭 해야 한다면 매개변수가 있는 메서드와 없는 메서드 두 개로 리팩터링하세요. 대부분 매개변수가 null이면 호출하는 편에서 프로그래밍 오류가 발생했다는 뜻이거든요.
다음은 유효성 검사를 적절히 수행하는 코드입니다.
class Logbook { void writeMessage(String message, Path location) throws IOException { if (message == null || message.trim().isEmpty()) { throw new IllegalArgumentException("The message is invalid!"); } if (location == null || Files.isDirectory(location)) { throw new IllegalArgumentException("The path is invalid!"); } String entry = LocalDate.now() + ": " + message; Files.write(location, Collections.singletonList(entry), StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND); } }