Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)
따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다.
이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피 가능
즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됨.
아래의 예는 Spring Security login 부분에서
user의 이름으로 정보를 가져오는 Optional의 추상 메서드를 선언하고
이를 가져와서 해당 정보가 없으면 orElseThrow한 부분이다.
public interface UserRepository extends JpaRepository<User, Integer>{
// SELECT * FROM user WHERE username=1?;
Optional<User> findByUsername(String username);
}
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username).orElseThrow(()->{
return new UsernameNotFoundException("해당 유저를 찾을 수 없습니다.");
});
return new PrincipalDetail(user); // 리턴이 되면 세션에 유저 정보가 저장이됨.
}