Optional은 주로 JPA 쿼리문을 통해 DB에서 데이터를 호출할때 만약 데이터가 없을때 null값을 피하기 위해 사용한다.
Optional은 기능이 실행되었을때 null이 올 수 있는 값을 감싸는 Wrapper클래스로 NullPointException(에러)이 발생하지 않게 해준다.
Optional 클래스는 해당값이 null일 경우 예외처리를 통해 원하는 방식으로 변경하여 출력할 수 있다.
Optional<Member> maybeMember = Optional.empty();
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
if (optionalHospital.isEmpty()) {
// ...
}
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
if (optionalHospital.isPresent()) {
// ...
}
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
Hospital hospital = optionalHospital.get(); // 값이 없으면 예외 발생
Hospital hospital = hospitalRepository.findById(id)
.orElseThrow(() -> new RuntimeException("해당 병원 정보를 찾을 수 없습니다."));
User user = userRepository.findByUserName(id)
ifPresent.(() -> new RuntimeException("아이디가 중복됩니다.."));
// 데이터가 있는 경우
Optional<Teacher> optionalTeacher3 = Optional.of(new Teacher("han", true, true));
String name = Optional.ofNullable(optionalTeacher3.get().getName()).orElse("이름이 없습니다.");
-----------
결과 : han
// 데이터가 없는 경우
Optional<Teacher> optionalTeacher3 = Optional.of(new Teacher(null, true, true));
String name = Optional.ofNullable(optionalTeacher3.get().getName()).orElse("이름이 없습니다.");
-----------
결과 : 이름이 없습니다.
❓orElse( ), orElseGet( ) 차이점은 무엇일까?
orElse( )
- 파라미터 값을 필요로한다
- 값이 null일 경우 동작한다.
orElseGet( )- 파라미터로 함수(함수형 인터페이스)를 필요로 한다.
- 값이 null일 경우 동작한다.
Optional<Teacher> optionalTeacher1 = Optional.of(new Teacher("k", true, true));
Teacher teacher = optionalTeacher1.get();