스프링 프레임워크 환경에서의 Assertion
스프링 프레임워크 에서는 다양한 Utils 를 제공하는데, 그 중에서 가장 많이 사용하는 것은 바로 Assertion 이다. 이 글에서는 스프링에서 제공하는 Assertion 에 대해서 소개하겠다. 참고로, 이 글에서 설명하는 Assertion 은 테스트 코드를 위한 것이 아니다. 애플리케이션 런타임 환경에서의 검증 코드에 사용한다.
Exception : Checked Exception
RuntimeException : Unchecked Exception
Unchecked Exception 은 컴파일 단계에서 처리하지 않는다. RuntimeException 를 상속받는 모든 Exception 은 Unchecked Exception 인데, 일반적으로 프로그래머의 실수에 의해서 발생하는 예외인 경우도 있고, 논리적으로 잘못된 인자에 의해서 발생하는 경우도 있다.
어쨋든 이 글에서 논하는 Assertion 은 입력값의 검증이나 예외 상황을 디버깅하기 위한 용도로 사용한다. 코드가 실행될 때 어떤 값이 들어와야 하는지 정의를 하거나, 값의 범위를 체크하는 등 애플리케이션의 안정성을 높여줄 수 있다.
자세한 내용은 생략하겠다. 같이 코드를 보면서 이해해보자.
Assert Util 클래스를 샘플 코드로 만들었다.
프로그래머의 실수에 의해 발생하는 경우에, 예외를 발생시켜보자. Coffee(커피) 를 조회하는 간단한 API 코드를 작성해보겠다. 아주 심플하다. 커피의 이름을 파라미터로 받아서, 커피를 조회를 하는 메서드를 정의하였다. 만약, 해당 메서드는 커피의 이름을 반드시 파라미터로 전달 받아야 한다. 커피의 이름이 Null 인 경우에는 RuntimeException 을 발생시키고 싶다. 아래 코드와 같이 작성할 수 있다.
값을 검증하는 로직이 필요한 경우에, 위와 같이 조건문과 IllegalArgumentException 을 발생시켜야 한다. 이런 조건문을 단순화하고, 반복적인 코드를 줄이기 위한 방법이 있을까? CustomAssert 클래스를 만들어서 static 메서드를 만들어보자.
static 메서드이기 때문에, CustomAssert.notNull() 로 실행할 수 있다.
이번에는 Collection 에 값이 없는 경우 예외를 발생시켜보자. 커피의 이름을 List<String> 타입으로 전달받는다고 가정했을 때, List<String> 의 값이 단 하나도 없는 경우에 RuntimeException 을 발생시키겠다. 일단, CustomAssert 클래스에 notEmpty 메서드를 정의하자.
비즈니스 로직에서는 아래 코드와 같이 CustomAssert.notEmpty 로 인자를 검증할 수 있다.
리스트로 문자열을 잘 받으면 아래와 같이 정상적으로 비즈니스 로직이 수행한다.
하지만, 빈 문자열을 받으면...
아래와 같이 필자가 정의한 RuntimeException 이 발생한다.
자세한 설명은 생략하겠다.
왜냐하면, 누군가가 잘 만들어놓은 Assertion 를 사용하면 되기 때문이다. 스프링 프레임워크를 사용한다면 Spring Assertion 을 사용하는 것을 추천한다.
참고로, JDK 1.4 부터 제공하는 Assertion 을 사용해 되지만, 이 글에서는 논하지 않겠다. 궁금하다면 아래 링크를 참고하길 바란다.
https://javacan.tistory.com/entry/79
위에서 작성한 코드를, 스프링에서 유틸에서 제공하는 Assertion 을 사용하겠다. 패키지 경로는 아래와 같다.
사용 방법은 아주 간단하다. 그냥 사용하면 된다...
별로 설명할게 없다. 직접 사용을 해보면 이해가 빠를 것이다.
스프링 프레임워크의 Assert 가 사용된 코드는 수없이 많다. 심심하면 찾아보길 바란다.
참고로, 스프링에서 제공하는 Assert 클래스를 상속받아서 신규로 클래스를 정의해도 된다. 상속 받은 클래스에서는 메서드를 재정의해서 사용할 수도 있다.
이번 글에서는 스프링에서 제공하는 Assertion 에 대해서 아주 간단하게 알아보았다. 애플리케이션의 신뢰성, 안정성을 높이기 위해 Assertion 을 적절하게 사용하면 좋을 것이다. 끝.
https://github.com/sieunkr/spring-assert
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/Assert.html