개요

Optional을 자주 사용하면서 정작 그 의미와 필요성을 모르고 사용했던 것 같다. 한 번 공부해보자.

Null

Null이라는 개념을 처음 고안한 사람은 Tony Hoare로 null을 만든 것은 10억 달러짜리 실수라고 말한적이 있다.

그 이유는 Null이 소프트웨어 개발 과정에서 수많은 버그와 시스템 오류를 유발해왓기 때문인데 이로 인해 개발자는 해당 데이터가 Null일 수 있는 가능성을 염두해두어 별도의 체크 로직을 작성해야하고 null일 경우 NPE가 발생하여 프로그램이 정상적으로 실행되지 못하게 한다. 또한 보안적 취약점도 생기기 때문이다.

Optinal

널이 고안되어 널에 대한 체크를 매번 해줘야한다면 이를 좀더 안전한 방식으로 다룰 수 있는 방법이 바로 Optional이다.

Post post = findById(1L);

if(post != null) {
  // 그 후 작업
}

이를 옵셔널로 바꾸어 본다면..

Optioanl<Post> optionalPost = findById(1L);
Post post = optionalPost.orElseThrow(PostNotFoundException::new);
...
public Optioanl<Post> findById(Long id) {
  return Optioanl.ofNullable(postMap.get(id));
}

이렇게 바뀐다. 옵셔널을 사용해야하는 이유는 이렇다.
만약 첫번째 코드처럼 값을 받아온 뒤 널 체크를 하는 경우는 이 둘이 묶여있지 않다. 따라서 하나의 작업으로 묶여야할 로직들의 연관관계가 희미해진다는 문제가 있고
메소드의 호출 결과가 null인지 여부에 따라 로직이 분기되어야하는데. 이걸 optional을 사용하여 한 번에 처리할 수 있다.