더북(TheBook)

이미 위 메서드는 유효성 검사를 일부 수행하고 있습니다. 불행히도 두 가지 심각한 문제를 안고 있지만요.

먼저 위 메서드는 null 참조를 올바르게 확인하지 않습니다. locationnull이면 Files.isDirectory()는 별다른 설명 없이 NullPointerException과 함께 실패합니다. messagenull이면 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);
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.