자바에서 Null 참조시 NullPointerException을 방지해주는 클래스를 말한다.
위의 코드에서 Optional.ofNullable()이 아닌 Optional.of() 메소드를 이용하면 NullPointerException이 발생한다.
Optional.of()는 들어올 데이터가 절대 null이 아닌 경우에만 사용하는데 null을 넣었기 때문이다.
Optional의 목적은 자바 개발 시 NullPointerException이 너무 자주 발생해서 데이터가 null이어도 처리가 가능하도록 도와주는 것이 Optional이라고 보면된다.
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("user doesn't exist");
orElseThrow는 Optional의 인자가 null일 경우 예외처리를 시킨다.
보통 JPA 사용 시에 위처럼 사용하는데 가져온 값이 null일 경우 예외를 발생시킨다.
여러 곳에서 활용할 수 있겠지만 개인적으로 느끼기에 가장 적극적으로 쓰인다고 생각하는건 Spring Data JPA다.
Optional<User> user = userRepository.findById(id); //정상
User user = userRepository.findById(id); //에러
Spring Data JPA 메소드는 return 값이 Optional 로 이루어져있다.
그러므로 위처럼 Optional 타입으로 받아야 정상 처리된다.
String name1 = Optional.ofNullable("test1").orElse("test2"); // 맞음
Optional name1 = Optional.ofNullable("test1").orElse("test2"); // 틀림
위에서 설명했던 코드를 다시 가져와서 복습해보자면 orElse~를 사용하는 경우 null이 아닐 시 Optional의 인자가 반환된다.
Optional 타입이 반환되는 것이 아니다.
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("user doesn't exist");
마찬가지로 Spring Data JPA 메소드는 orElse~를 사용할 수 있는데, orElse~ 문법을 사용하면 null이 아닐 경우 내부적으로 Optional의 value를 가져오도록 구현되어있다.
그러므로 이때는 User라는 Entity 객체로 받아서 처리할 수 있다.