상세 컨텐츠

본문 제목

Spring Assert클래스는 왜 Supplier를 활용하고 있을까?

공부/Spring

by seungpang 2024. 6. 5. 02:00

본문

반응형

Spring Framework Assert 클래스는 Java 애플리케이션에서 사용되는 유틸리티 클래스다.

주로 메서드의 인수 유효성 검사와 같은 방어적 프로그래밍 기법을 지원한다.

이 클래스는 다양한 정적 메서드를 제공하여 특정 조건이 만족되지 않을 경우 예외를 던지도록 한다.

이러한 방법은 코드의 견고성을 높이고, 문제를 조기에 발견하여 디버깅을 용이하게 한다.

public User(String username, VehicleIdentificationNumber vin) {
    Assert.hasLength(username, "Username must not be empty");
    Assert.notNull(vin, "VIN must not be null");
    this.username = username;
    this.vin = vin;
}

위에 코드는 Spring Boot에서 가져온 코드다. 이런식으로 username의 값이 비어있거나 VIN이 null일 경우 IllegalArgumentException을 발생시킨다.


Supplier를 활용한 유효성 검사

Assert 클래스는 람다 표현식을 사용하여 유효성 검사 실패 시 예외 메시지를 제공할 수 있다.

예를 들어

Assert.notNull(version, () -> "No version found for Spring Data artifact " + artifactId);

이 코드에서는 notNull 메서드에 Supplier<String> 타입의 람다 표현식을 전달하여, version이 null인 경우에만 메시지를 생성하도록 한다.

자세한 설명은 밑에 notNull 메서드 구현을 살펴보면 된다.

public static void notNull(@Nullable Object object, String message) {
    if (object == null) {
        throw new IllegalArgumentException(message);
    }
}

public static void notNull(@Nullable Object object, Supplier<String> messageSupplier) {
    if (object == null) {
        throw new IllegalArgumentException(nullSafeGet(messageSupplier));
    }
}

private static String nullSafeGet(@Nullable Supplier<String> messageSupplier) {
    return (messageSupplier != null ? messageSupplier.get() : null);
}

첫 번째 notNull 메서드

  • 주어진 객체(object)가 null이 아닌지 확인한다. null인 경우 IllegalArgumentException을 던진다.

두 번째 notNull 메서드

  • 주어진 객체(object)가 null이 아닌지 확인한다. null인 경우 IllegalArgumentException을 던지는데, 예외 메시지는 Supplier 인터페이스를 통해 제공된다.
  • messageSupplier: 유효성 검사가 실패했을 때 던져질 예외 메시지를 제공하는 함수형 인터페이스입다. 메시지를 지연 생성할 수 있다.

nullSafeGet 메서드

  • messageSupplier가 null이 아닌 경우 메시지를 생성하고, null인 경우 null을 반환한다.

람다 표현식 사용의 이점

람다 표현식을 사용하는 주된 이유는 성능 최적화다. 메시지 생성 비용이 높은 경우, 실제로 예외가 발생하지 않으면 메시지 생성을 피할 수 있다.

// 일반 문자열 메시지
Assert.notNull(version, "No version found for Spring Data artifact " + artifactId);

// 람다 표현식을 사용한 메시지
Assert.notNull(version, () -> "No version found for Spring Data artifact " + artifactId);

첫 번째 경우에는 항상 문자열 연결 연산이 수행된다. 반면, 두 번째 경우에는 version이 null일 때만 메시지 생성이 수행한다.

이는 불필요한 메시지 생성으로 인한 성능 저하를 방지하는 데 유용하다.


결론

Spring Framework의 Assert 클래스는 유효성 검사를 단순화하고 코드의 가독성을 높이는 데 유용하다.

특히, Supplier를 활용한 메시지 제공은 성능 최적화와 관련된 중요한 기법이다.

Assert 클래스에 다양한 메서드가 있으니 한번 참고해보면 좋을 것 같다.

Reference

관련글 더보기