"값이 있을 수도 있고 없을 수도 있는 경우"를 안전하게 처리하는 객체!

Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println); // 값이 있으면 출력

Optional을 사용하는 이유 (NullPointerException 방지) 🚨

null을 직접 다루면 NullPointerException(NPE)이 발생할 가능성이 큽니다.

null을 직접 다루는 코드 (NPE 위험)

public String getUserName(User user) {
    return user.getName();  // user가 null이면 NPE 발생
}

Optional을 활용한 안전한 코드

public Optional<String> getUserName(User user) {
    return Optional.ofNullable(user.getName());
}

📌 차이점:

Optional과 Stream API 활용

Optional은 Stream과 함께 사용할 때 더욱 강력해집니다.

Optional을 활용한 안전한 데이터 처리

Optional<User> user = userRepository.findByEmail("[email protected]");

user.map(User::getName).ifPresent(System.out::println);

📌 map()을 사용하면 값이 존재하면 변환하고, 없으면 아무 동작도 하지 않음!

Optional을 JPA와 함께 사용하기

Spring Data JPA에서는 findById() 메서드가 Optional을 반환하므로 안전하게 사용할 수 있습니다.