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);
잘못된 해결 방법이거나 잘못된 정보가 있다면 언제든지 알려주세요 🙇