Optional 클래스란
Optional 클래스는 null을 처리하는 방법을 개선하기 위해 도입된 클래스로, 값이 있을 수도 있고 없을 수도 있는 상황을 처리하는 데 사용됩니다. Optional 객체는 값을 감싸는 래퍼(wrapper) 역할을 하며, 값이 존재하지 않는 경우에 대한 처리를 표현적으로 표현하는데 유용합니다.
orElseThrow()
orElseThrow() 메서드는 자바 8부터 도입된 Optional 클래스의 메서드 중 하나입니다.
스프링 애플리케이션에서 자주 사용되는 메서드 중 하나입니다.
orElseThrow() 메서드는 Optional 객체에서 값을 꺼내오는 메서드로, 값이 존재하는 경우에는 해당 값을 반환하고, 값이 없는 경우에는 지정된 예외를 발생시킵니다. 이를 통해 Optional 객체를 사용하여 NullPointerException 등의 예외를 방지할 수 있습니다.
import java.util.Optional;
public class Example {
public static void main(String[] args) {
String someValue = "Hello"; // 또는 null로 테스트해볼 수 있습니다.
// Optional 객체 생성
Optional<String> optionalValue = Optional.ofNullable(someValue);
// 값이 존재하는 경우 해당 값을 반환하고, 값이 없는 경우 예외 발생
String result = optionalValue.orElseThrow(() -> new RuntimeException("Value is not present"));
System.out.println("Result: " + result);
}
}
스프링에서는 Optional 클래스를 사용하여 메서드의 반환 값으로 null을 반환하는 것을 피하고,
대신 Optional 객체를 반환하여 클라이언트 코드에서 더 명시적인 처리를 할 수 있습니다.
orElseGet()
orElseGet() 메서드 Optional 클래스의 메서드 중 하나로, orElseThrow()와 유사하게 값이 존재하지 않는 경우의 처리를 지원합니다. orElseGet() 메서드는 값이 존재하지 않는 경우, 기본적으로 제공된 람다 표현식 또는 Supplier 함수를 실행하여 대체 값을 생성합니다.
import java.util.Optional;
public class Example {
public static void main(String[] args) {
String someValue = null; // 또는 "Hello"로 테스트해볼 수 있습니다.
// Optional 객체 생성
Optional<String> optionalValue = Optional.ofNullable(someValue);
// 값이 존재하는 경우 해당 값을 반환하고, 값이 없는 경우 대체 값을 생성하여 반환
String result = optionalValue.orElseGet(() -> "Default Value");
System.out.println("Result: " + result);
}
}
위의 예제에서 optionalValue는 ofNullable() 메서드를 통해 null로 초기화되었기 때문에 orElseGet() 메서드에서는 람다 표현식에 의해 "Default Value"를 반환합니다. 만약 someValue를 "Hello"로 설정하면 orElseGet() 메서드에서는 해당 값을 반환할 것입니다.
orElseGet() 메서드를 사용하면 기본적으로 Supplier 함수를 이용하여 대체 값을 생성하므로, 값이 없는 경우에만 해당 로직이 실행되기 때문에 자원의 낭비를 최소화할 수 있습니다. 이러한 특성 때문에 대용량 데이터 생성이나 복잡한 연산의 경우 유용하게 사용될 수 있습니다.