첨에 Optional.get()을 사용하지마라는 말을 듣고 한동안 이게 무슨 말인지 이해가 안됐는데. 지금은 어렴풋이 이해가 되는것 같다.
Optional은 null값을 피하기 위해서 나온 래퍼클래스이다. Optional을 통해 객체를 래핑하면 null값이어도 NullPointerExcption이 안나고 그것을 여러 메서드(api?)를 통해 안전하게(?) 다룰 수 있게 된다.
그럼 selectedQuestion
을 어떻게 받아야할까?
Jane의 코드를 참고해보자면
Question question = questionRepository.findById(id).orElseThrow(QuestionNotFoundException::new);
Optional의 orElseThrow()
를 이용해서 처리해준다. orElseThorw
는 questionRepository
에서 findById(id)
를 통해 얻은 question이 null
이면 예외를 던져주도록 해주는 메서드이다.
public class QuestionNotFoundException extends RuntimeException {
public QuestionNotFoundException() {
super("해당 번호의 질문이 존재하지 않습니다.");
}
위 코드에서는 QuestionNotFoudException
이라는 예외를 따로 만들어서 null
이 들어오면 View에서 커스텀된 예외를 던져줄 수 있는 것이다.
API Note:
Optional is primarily intended for use as a method return type where there is a clear need to represent “no result,” and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다. Optional 타입의 변수의 값은 절대 null이어서는 안 되며, 항상 Optional 인스턴스를 가리켜야 한다.
만약에 그냥 null이 들어오도록 하면 NullPointerExcption이 들어오면?
아예 에러페이지로 이동하기 때문에 사용자에게 굳이 보여주고 싶지 않은 정보들이 에러메세지에 모두 포함될 수 있다. 이보다 NullPointerExcption이 나면 서버에 문제가 생기는 것인가? 이부분은 물어봐야겠다.
오늘 스크럼에서 물어봤다. 계속 물어보면서 생각을 해보니 내가 궁금했던건 당연한거지만 왜 예외처리를 해주는거지? 였다. 일반 프로그램에서는 예외를 처리안해주면 쓰레드가 죽기때문에 문제가 생긴다. 그런데 웹에서는 예외를 처리안해줘도 스프링에서 기본적으로 Basic어쩌고저쩌고Exception이 처리해준다고 한다.
그래서 문제가 없는데 그래도 예외처리를 해주는 이유는, 기본적으로 웹에서 예외처리를 해줄때 그 특정 예외에 대해서 개발자가 의도하는 바가 있을 것이다. 예를 들어, 어떤 예외가 나면 특정 페이지로 리다이렉트 해준다던가 말이다. 그것을 처리하지 안해줬다는 건 개발자가 의도하려 했던 방향으로 흘러가지 않기 때문에 개발자의 의도와 다른 것과 더불어 사용자 경험을 위해서라도 의도하고 있지 않은 예외가 발생하고 있지 않은지 생각해보며 처리해줘야한다.
좋은 글이네요! 화이팅! 👍