- SSAFY 1학기 프로젝트를 리팩토링하기 위해 다른 사람들의 블로그를 참고해가며 Error Handling에 대해 공부를 하고 있었는데 Optional 클래스가 사용되는 것을 보았다. - 대부분의 포스팅들에서도 Optional 클래스가 사용되고 있었고 중요도가 높다고 생각이 들어 정리해보려고 한다.
Optional 클래스
Java 8에서부터 Optional<T> 클래스를 사용하여 NPE(NullPointerException)이 발생하지 않도록 방지할 수 있는 Wrapper 클래스이다.
public final class Optional<T> {
/**
* Common instance for {@code empty()}.
*/
private static final Optional<?> EMPTY = new Optional<>();
/**
* If non-null, the value; if null, indicates no value is present
*/
private final T value;
...
}
Optional 클래스 객체 생성
Optional.empty()
Optional은 Wrapper 클래스이기 때문에 값이 없을 수도 있는데 null 대신에 Optional.empty()를 사용하여 대체한다.
위 코드에서 볼 수 있듯이 Optional 클래스는 내부에서 static 변수로 EMPTY 객체를 생성하여 공유함으로써 메모리를 절약하고 있다.
Optional의 값이 절대 null이 아니라면 Optional.of()를 이용하여 객체를 생성한다.
만약, Optional.of()를 이용하여 null을 저장하려고 하면 NPE가 발생한다.
// Optional의 value는 null 값이 들어올 수 없다.
Optional<String> optional = Optional.of("cks._.hong");
Optional.ofNullable()
Optional의 값이 null이거나 null이 아닐 수도 있는 경우에는 Optional.ofNullable을 이용하여 객체를 생성하다.
생성 이후, 값이 없는 경우에는 orElse나 orElseGet 함수를 통해서 값을 가져올 수 있다.
// Optional의 value는 null일 수도 있고 아닐 수도 있다.
Optional<String> optional = Optional.ofNullable(getBlogName());
// 값이 없다면 "cks._.hong"을 return 한다.
String blogName = optional.orElse("cks._.hong");
- Optioanl 클래스는 값을 Wrapping, Unwrapping, null일 경우의 대체 함수 호출 등의 오버헤드가 존재하여 시스템의 성능 저하로 이어질 수 있다. - 따라서, Optional은 메소드의 결과가 null이 될 수 있으며, null에 의한 오류가 발생할 가능성이 높을 때만 사용해야 한다.
프로젝트 활용
유저 ID를 이용하여 유저를 찾는 API인데 해당 과정에서 USER의 정보가 null 일 수도 있어서 활용해 보았다.
다른 API 함수들도 체크하여 리팩토링을 진행할 예정이다.
추가적으로, Client Response에 대해서도 map 방식이 아닌 공통 Response Structure를 만들어 일관성있는 응답을 만들어 나아갈 예정이다.