check()와 require() validation

코틀린의 validation

로직을 실행하기 전에 검증을 통해서 사용자의 input이나 사용하는 상태가 적절한지에 대한 판단이 필요합니다.

isEmpty()나  orNull()을 포함한 함수를 사용하여 간단하게 검증하는 방법이 일반적인데요.

이러한 과정에서 코틀린은 좀더 쉽고 정형화 된 함수를 사용하는데, 이 것이 check와 require 입니다.

 

우테코 프리코스 과정을 거치면서 처음으로 학습하여 코드에 적용하게 되었습니다.

두 함수 모두 Boolean 형태의 argument를 받아서 false인 경우 예외처리하도록 합니다.

IllegalArgumentException를 throw하며, 파라미터의 값을 검증하는데 사용할 수 있습니다.

 

require()

require() 함수는 매개변수의 값이 참인지 체크하여 거짓이면 IllegalArgumentException를 발생시킵니다.

requreNotNull() 함수는 매개변수의 값이 null이라면 IllegalArgumentException를 발생시킵니다.

 

    fun checkInputRacingCount(
        userInput: String
    ) {
        require(
            checkIsnumber(userInput) &&
                    checkIsPositive(userInput.toInt())
        ) {
            "양의 정수를 입력해야 합니다."
        }
    }

 

코틀린에서 require() 함수를 위처럼 사용할 수 있습니다.

false로 검증 될 경우 "양의 정수를 입력해야 합니다."의 문구를 출력합니다.

Boolean 값으로 검증을 처리하며, 함수를 통해서 검증할 인자를 전달하는 방법을 사용합니다.

 

    private fun checkIsnumber(
        userInput: String
    ): Boolean {
        return try {
            userInput.toInt()
            true
        } catch (e: NumberFormatException) {
            false
        }
    }

    private fun checkIsPositive(
        number: Int
    ): Boolean {
        return number > 0
    }

 

 

check()

check()는 매개변수의 값이 참인지 체크하여 아니라면 IllegalStateException을 발생시킵니다.

checkNotNull()은 매개변수의 값이 null인지 체크하여 null이라면 IllegalStateException을 발생시킵니다.

IllegalStateException는 일반적으로 메소드를 호출할 상태가 아니라는 의미로 발생됩니다.

 

check()는 require과 동일하게 사용되며, 함수 원형과 검증 코드를 통해서 에러 발생 여부를 결정합니다.

각 IllegalArgumentException 와 IllegalStateException 던지는 에러만 다를 뿐 같은 플로우로 동작합니다.

 

 

예외 활용의 장점

문제가 있는 경우 함수가 예상하지 못한 동작을 하지 않고 예외를 던지며, 제한을 통해서 코드를 더 안정적으로 작성할 수 있습니다.

또다른 장점으로는 코드가 자체적으로 예외를 처리하는 과정이기 때문에 단위 테스트를 줄일 수 있습니다.

스마트 캐스트 기능을 활용할 수 있게 되므로 타임 변환을 적게 할 수 있다는 장점도 가지고 있습니다.