Optional은 Java8부터 지원하는 클래스로, NullPointException 즉, 널값으로 인해 발생하는 에러를 방지해주는 클래스이다.
Optional<T> 클래스와 관련한 설명은 이미 잘 정리된 기술블로그들이 많으니 구글링해서 찾아보길 권한다.
나는 참고로 이 블로그 봄
패스트캠퍼스 강의를 들으며 Optional 클래스의 orElseThrow를 사용할 때 문제가 발생했다.
강의는 Java17 버전을 사용했지만 나는 이미 Java8 버전이 있었기 때문에 8버전으로 강의를 수강하고 있었는데, Java8 버전은 orElseThrow에 인자값을 받아야하는 반면 10 이상의 버전부터는 인자값이 필요 없다는 것이다.
그러면 인자값을 넣어주자!
무엇을 넣어줄까?
에러와 관련된 거니까 대표적인 Exception을 넣어주자
Article article = articleRepository.findById(1L).orElseThrow(new Exception());
하지만 에러가 발생했다.
구글링을 해보니 new Exception()같은 방식이 아니라 다른 방식으로 쓰길래
Article article = articleRepository.findById(1L).orElseThrow(Exception::new);
이렇게도 써보았으나 여전히 에러가 났다.
+) 위 코드가 작성된 메소드에 throw Exception을 적어주면 에러가 해결된다.
void givenTestData_whenUpdating_thenWorksFine() throw Exception {
Article article = articleRepository.findById(1L).orElseThrow(Exception::new);
...
}
이게 맞는 방법인지는 모르겠으나 해결된다.
그렇다면 article을 Optional 타입으로 받자.
Optional<Article> article = Optional.ofNullable(articleRepository.findBy(1L));
그런데 이러면 결국 똑같은 문제의 반복 아닌가?
여전히 에러는 해결되지 않았다.
첫 번째 생각의 코드를 기반으로 인자를 수정하니 문제가 해결되었다.
Exception이 아닌 다른 클래스를 적어주니 메소드에 throw를 적어주지 않아도 해결됐다!
내가 사용한 것은 런타임 에러 IllegalArgumentException
Article article = articleRepository.findById(1L).orElseThrow(IllegalArgumentException::new);
잘못된 해결 방법이거나 잘못된 정보가 있다면 언제든지 알려주세요 🙇