[java] 메서드 매개변수 validation에 assert 이용시 주의하기

임현규·2023년 6월 30일
0

개인 공부

목록 보기
8/11
post-custom-banner

메서드 매개변수 validation 필요성

이펙티브 자바를 보면 매서드에 입력되는 매개변수 인자도 validation을 하라고 한다. 그러면 메서드를 더욱 안정적으로 사용할 수 있다. 보통은 Null 관련해서 체크를 많이 할 것이다. 매서드 매개변수를 validation하는 것은 여러가지가 있다.

  1. assert 이용하기
  2. spring bean validation을 활용하기
  3. 직접 throw 하기
  4. 원시 객체를 만들어 인스턴스 생성시 validation 수행

이렇게 크게 4가지가 이 중에 assert 사용시 문제점에 대해 이야기 해보자

assert

예외처리의 옛날 방식중 하나로 assert를 통해 로직 중간에 간단한 validation을 수행할 때 사용된다. assert는 컴파일 옵션에 따라 validation을 할 수도 있고 안할 수도 있다.

assert는 내부적으로 오류 없이 안전하게 validation을 하기 위한 용도이고 예외 발생시 AssertionError가 출력이 된다.

public API 메서드에서 사용하는 인자는 사용자 입력에 의해 발생한 에러일 가능성이 높다. 그렇기 때문에 컴파일 옵션에 따라 예외가 결정되는 assert 보다는 IlleagalArgumentException과 같은 명시적인 에러를 Throw 하는 것이 더 좋다.

💡 public 메서드 혹은 주요 로직에 반드시 예외처리를 해야하는 경우 assert말고 다른 것을 고민해보자.

assert의 대안

만약 공개 API에 사용하고 싶은데 assert 방식이 코드 가독성에 좋은 것 같고 편하다는 생각이 들면 org.springframework.util에서 제공하는 Assert를 사용해 볼 수 있다.

Assert 클래스는 헬퍼 클래스로 validation을 assert문법과 같이 boolean expression을 인자로 받고 IlleagalArgumentException을 명시적으로 발생시킬수 있다.

사용법 또한 매우 간단하다.

Assert.isTrue(expression, message);

만약 웹 개발시 validation 중앙화와 어노테이션으로 간단하게 예외처리를 수행하고 싶다면 Spring Bean Validation을 써볼만 하다. Spring Bean Validation을 활용하면 매개변수나 필드에 어노테이션을 활용해서 메서드 바디에 직접 인자에 대한 예외처리를 할 필요가 없기 때문에 코드가 간결하고 쉬워진다.

최종적으로 제일 직관적인 방법은 직접 Throw를 직접 발생 시키는 방법도 있다.

profile
엘 프사이 콩그루
post-custom-banner

0개의 댓글