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을 발생시킨다.
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 메서드
두 번째 notNull 메서드
nullSafeGet 메서드
람다 표현식을 사용하는 주된 이유는 성능 최적화다. 메시지 생성 비용이 높은 경우, 실제로 예외가 발생하지 않으면 메시지 생성을 피할 수 있다.
// 일반 문자열 메시지
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
클래스에 다양한 메서드가 있으니 한번 참고해보면 좋을 것 같다.
Spring 프로젝트 컨트리뷰터 된 후기 (ThreadLocal.set(null) vs ThreadLocal.remove() ) (0) | 2024.05.24 |
---|---|
분산락을 이용한 메시지 좋아요 기능 동시성 문제 해결 방안 (0) | 2024.05.16 |
Spring Retry를 활용한 메시지 좋아요 기능의 동시성 문제 해결 방안 (0) | 2024.04.11 |